zoukankan      html  css  js  c++  java
  • python_day20 Django分页器,Cookies&Session,auth模块,Ajax

    上节Django-多表查询知识点回顾
    models.py: 
    class Book(models.Model):
        nid=models.AutoField(primary_key=True)
        title=models.CharField(max_length=32)
       
        # 书籍与出版社: 一对多
        publisher=models.ForeignKey(to="Publish",related_name="bookList")
        # 书籍与作者: 多对多
        authors=models.ManyToManyField("Author")
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
       
    class Author(models.Model):
        name=models.CharField(max_length=32)
        
    class AuthorDetail(models.Model):
        addr=models.CharField(max_length=32)
        author=models.OneToOneField("Author")
     
     
    1、单表查询
           models.Book.objects.all()       #   QuerySet    []        
           models.Book.objects.filter(nid__gt=1,nid__lt=10)  #   QuerySet   []             
           models.Book.objects.get()       # model对象   
           models.Book.objects.values()     #   QuerySet   [{},{}]            
           models.Book.objects.values_list()      
           models.Book.objects.exclude()      
           models.Book.objects.all().first()   
           models.Book.objects.all().last()   
           models.Book.objects.all().orderby()   
           models.Book.objects.all().reverse() 
           models.Book.objects.values("price").distinct() 
           models.Book.objects.all().count()
           models.Book.objects.all().exist()   
        
        ---- 双下划线:
         models.Book.objects.filter(nid__gt=12)    
         models.Book.objects.filter(price__in=[112,223,444])    
           
     支持链式操作:   
             models.Book.objects.all().filter().orderby("id").count() 
             models.Book.objects.all().get().orderby("id").count() 
       
    1、跨表查询
       ----  基于对象
       
             (1) 查询Linux这本书的出版社名称和作者名字   属于正向查询  按关联字段
        book_obj=models.Book.objects.get(title="linux")
        book_obj.publisher.name
        
        authors_list=book_obj.authors.all()
        for author in authors_list:
         print(author.name)    
       
       (2) 人民出版社出版过的所有书籍名称   属于反向查询  if 设置related_name,那么related_name的值,没有设置,按表明_set
           publish_obj=models.Publish.objects.filter(name="人民出版社").first()
           book_list=publish_obj.bookList.all()
                 for book in book_list:
             print(book.title)
          
       (3) alex 出版过的所有书籍的名称    属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set
                 alex=models.Author.objects.get(name="alex")
                 book_list=alex.book_set.all()
                 for book in book_list:
             print(book.title) 
          
             (4) 作者alex的所在地址  正向查询 按字段  反向查询 按表名
           alex=models.Author.objects.get(name="alex")
        alex.authordetail.addr
        
         
     ----  基于QuerySet   双下划线:   正向查询:按字段     反向查询:按表名    key:  1 过滤条件  2 查询结果
             (1) 查询Linux这本书的出版社名称和作者名字   属于正向查询  按关联字段
            
        models.Book.objects.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}]
        models.Book.objects.filter(title="linux").values("authors__name")   #
        
        
       (2) 人民出版社出版过的所有书籍名称 
                 
        models.Book.objects.filter(publisher__name="人民出版社").values("title")
                 models.Publish.objects.filter(name="人民出版社").values("book__title")   
        
       (3) alex 出版社过得所有书籍的名称
       
           models.Book.objects.filter(authors__name="alex").values("title")
       
        models.Author.objects.filter(name="alex").values("book__title")
        
        
    今日内容:
            1、 分页
            2、 cookie session
            3、 ajax (*************)
            4、 form组件 
    
    1、分页
    Pager项目 app01应用
    为数据库Book添加100条数据
    models:
    class Book(models.Model):
     name=models.CharField(max_length=32)
     price=models.DecimalField(max_digits=7,decimal_places=2)
    def add(request):
     BookList=[]
     for i in range(100):
      BookList.append(models.Book(name="book"+str(i),price=30+i*i))
     models.Book.objects.bulk_create(BookList)
     return HttpResponse("OK")
    数据库迁移:makemigrations/migrate
    运行:127.0.0.1:8000/add
    templates:
    index.html
                    {% for book_obj in book_list %}
                        <tr>
                            <td>{{ forloop.counter }}</td>
                            <td>{{ book_obj.title }}</td>
    {#                        <td>{{ book_obj.pubDate|date:"Y-m-d" }}</td>#}
                            <td>{{ book_obj.price }}</td>
    分页器的引入
          
    2、cookie session
    
        cookie: 保留在客户端(浏览器)的存放键值对的容器  {"":""} 
        
     session: 保留在服务器上的一个容器     {"":""}   
     
     
     
     def login:
          if 1:
           request.session["is_login_egon"]=True
           request.session["username"]="alex"
        
        # 赋值session实现了什么
        (1) django---写好响应cookie:{"sessionID":"123asdas12312"}
        (2) dajngo--- 在django-session表中创建一条记录
                 
             session-key      session-data
            123asdas12312    {"is_login_egon":True,"username":"alex"}
        
        
        
        def index:
              if not request.session.get("is_login_egon"):
             # 取值session ,实现了什么
          (1) dajngo-- 先获取cookie的sessionID: 123asdas12312
          (2) django---ret=models.django_session.objects,filter(session-key="123asdas12312")
          
          (3) 我们自己实现的:ret["is_login_egon"]   
          
          
                      return redirect("/login/")
     
     
     {"sessionID"L:""}
     
     
     会话---session
     注销---清除session
            request.session.flush()
         
                (1) dajngo-- 先获取cookie的sessionID: 123asdas12312
          (2) django---ret=models.django_session.objects.filter(session-key="123asdas12312")
          
          (3) flush:ret.delete()
     
     
    views.py:
    def login(request):
        if request.method == "POST":
            username = request.POST['user']
            password = request.POST['pwd']
            user = models.UserInfo.objects.filter(name=username, pwd=password)
            if user:
                # 设置session内部的字典内容
                request.session['is_login'] = 'true'
                request.session['username'] = username
                # 登录成功就将url重定向到后台的url
                return redirect('/index/')
                # 登录不成功或第一访问就停留在登录页面
        return render(request, 'login.html')
    def index(request):
        print(request.session, "------cookie")
        print(request.COOKIES, '-------session')
        """
        这里必须用读取字典的get()方法把is_login的value缺省设置为False,
        当用户访问backend这个url先尝试获取这个浏览器对应的session中的
        is_login的值。如果对方登录成功的话,在login里就已经把is_login
        的值修改为了True,反之这个值就是False的
        """
        is_login = request.session.get('is_login', False)
        # 如果为真,就说明用户是正常登陆的
        if is_login:
            # 获取字典的内容并传入页面文件
            cookie_content = request.COOKIES
            session_content = request.session
            username = request.session['username']
            return render(request, 'index.html', locals())
        else:
            """
            如果访问的时候没有携带正确的session,
            就直接被重定向url回login页面
            """
            return redirect('/login/') 
    def log_out(request):
        """
        直接通过request.session['is_login']回去返回的时候,
        如果is_login对应的value值不存在会导致程序异常。所以
        需要做异常处理
        """
        try:
            # 删除is_login对应的value值
            del request.session['is_login']
            # OR---->request.session.flush() # 删除django-session表中的对应一行记录
        except KeyError:
            pass
        # 点击注销之后,直接重定向回登录页面
        return redirect('/login/')
      
    auth模块:
    使用 create_user 辅助函数创建用户:
    from django.contrib.auth.models import User
    user = User.objects.create_user(username='',password='',email='')
    views:
    def login(request):
        if request.method == "POST":
            username = request.POST['user']
            password = request.POST['pwd']
            # user = models.UserInfo.objects.filter(name=username, pwd=password)
            #auth模块
            user=auth.authenticate(username=username,password=password)
            print("=========",user)
            if user is not None:
                # 设置session内部的字典内容
                # request.session['is_login'] = 'true'
                # request.session['username'] = username
                #auth模块
                auth.login(request,user)
                # 登录成功就将url重定向到后台的url
                return redirect('/index/')
                # 登录不成功或第一访问就停留在登录页面
        return render(request, 'login.html')
    def index(request):
        # auth模块
        if request.user.is_authenticated():
            # username = request.session['username']
            return render(request, 'index.html')
        else:
            """
            如果访问的时候没有携带正确的session,
            就直接被重定向url回login页面
            """
            return redirect('/login/') 
      
     客户端---》服务器
     
         地址栏
      a标签
      form post
      form get
      
      ajax(js)
    
    AJAX:
          异步
       局部刷新
       
       
       ajax步骤:
           
        第一步:
             确定事件
           第二部:
             
          $.ajax({
             url:"",
          type:"",
          success:function(data){    // data:响应数据
          
          
          }
          })
      
    作业1:
            把登录验证的session做成装饰器
       
    作业2:
            ajax实现登录与注册
      
      
    作业3:
           数据库表
      class Articel
        id 
        title
        desc
        time
        
        user=...  
      class user 
      
      
     
     
    

      

  • 相关阅读:
    最短路总结
    关于最小生成树(并查集)prime和kruskal
    关于优先队列浅析(priority_queue)
    惨痛第十届蓝桥杯总结(附录蓝桥省赛知识点总结)-C++ B组
    初识STL vector
    sort();对结构体数组的排序
    Git 分支管理
    Git 远程仓库
    Matlab R2016a 破解教程
    Ubuntu卡在logo界面
  • 原文地址:https://www.cnblogs.com/liweijing/p/7940366.html
Copyright © 2011-2022 走看看