zoukankan      html  css  js  c++  java
  • day-64Django

    模板的导入使用

      相当于python的import

        比如:导入form表单
      在需要导入的地方写

        {% include “xxx.html” %}
      注:导入多少相同的html,就显示多少

    案例:

    {% load xx %}
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
      
        <ul>
            <li>{{ myli.0 }}</li>
            <li>{{ myli.1 }}</li>
            <li>{{ myli.2 }}</li>
        </ul>
        
        {% include “xxx.html” %}
        
        <ul>
            <li>{{ mydict.name }}</li>
            <li>{{ mydict.age }}</li>
        </ul>
    
        <hr>
    
    </body>
    </html>

    模板的内置函数

        <hr>
        {{ name|upper }}             将name变量的值name传给upper这个内置函数
        {{ name|lower }}    
        {{ name|first|upper }}         只显示第一个首字母,并且大写
        {{ name|title }}               显示全部,并且首字母大写
        {{ name|truncatewords:'2' }}    只显示前两个单词,后面省略
      

        import datetime          下面内置函数需要在函数视图写这些,再传入
        ctime = datetime.datetime.now()

      {{ ctime|date:"Y-m-d H:i:s" }}  显示2019-02-02 07:04:23
        <hr>
    底层就是调用了python函数

    模板的自定制函数

    配置:

      想使用自定义函数,需要在使用的地方上的app文件夹下创建一个templatetags(名字不能错)文件夹,
      然后在下面创建py文件,这里面就可以自定义函数

    1.simple_filter:
    py文件中:

    from
    django import template register = template.Library() @register.filter() def my_func(val, arg1): 只能接受两个参数 return val + arg1
    HTML文件中

    {% load xx %} 想使用自定制函数,上面必须写这行,xx是py文件的文件名
    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Title</title> </head> <body> <hr> {{ name|my_func:'kkkk'}} 传入两个参数,函数后面不能有空号 <hr> </body> </html>

    2.simple_tag:

    py文件中

    from django import template
    register = template.Library()
    
    
    @register.simple_tag()      
    def my_tag(val, arg1, arg2):    后面接受无数参数
        return val + arg1 + arg2

    HTML文件中

    {% load xx %}        想使用自定制函数,上面必须写这行,xx是py文件的文件名
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
    
    
           
        <hr>
            {% my_tag 'zekai' 'is' 'jjj' %}        
        <hr>
    
    </body>
    </html>
    
    

    session

    特点:

      1.存在于服务端的包含用户敏感信息的键值对

        如下:

          {
            “cookie值” : {“name”:‘zekai’, 'age‘:18},
            “cookie值1” : {“name”:‘zekai2’, 'age‘:34},
          }


      2.如果浏览器cookie被禁用,也可以拿到cookie用第三方软件去访问

    
    
    主页
    def  test(request):
        # 获取session
        name = request.session.get('name')
        
        request.session底层原理:
          通过sessionid这个键拿到cookie的值,在通过cookie的值拿到对应唯一一个用户,从而get("name")
          如果cookie值都拿不到,根本不会拿到用户信息,所以必须让他跳转到登录
       
        if  name:
            
            return render(request, "test.html", { "name":name})
    
    登录页面
    def login(request):
    
        if request.method == 'GET':
            return render(request, 'login.html')
        else:
            username = request.POST.get('username')
            pwd = request.POST.get('pwd')
          
            if username == 'zekai' and pwd == "123":
               
                ### 设置session值
                request.session['name'] = username
                request.session['pwd'] = pwd
                request.session['age'] = 12
                
                
                上面完成后经过了这两个步骤:
                    1. 向浏览器设置cookie值 
                        {'sessionid''i93rkrcw9snt8wbups8gb3owm09e393g'}
                    
                    2. 服务端记录session值(默认记录在数据库中)
                        {
                            “cookie值” : {“name”:‘zekai’, 'age‘:18},
                        } 
                
                
                数据库session表中信息:
                    cookie是第一列
                    用户敏感信息加密过后放在第二列       
                    最后一列是cookie过期时间(默认两个星期过期)       
                 
                注意:前提需要完成表模型的两个操作指令,也就是生成一张session表
                 
                 
                return  HttpResponse('ok')
            else:
                return render(request, 'login.html')
    
    

     session的使用

           # 查询session值
                # print(request.session.keys())     # dict_keys(['name', 'pwd', 'age'])
                # print(request.session.values())   #  dict_values(['zekai', '123', 12])
                # print(request.session.items())    # dict_items([('name', 'zekai'), ('pwd', '123'), ('age', 12)])
                
                
                
                # 设置session值
                request.session['name'] = username
                request.session['pwd'] = pwd
                request.session['age'] = 12
                
                
                
                request.session.session_key            #拿到当前登录过用户的cookie
         
                request.session.clear_expired()         #当前用户的cookie有效期过期了,在数据库中把这条数据删除
         
                request.session.exists("session_key")   #判断要登录的用户数据库中是否有cookie值
            
               request.session.clear()          #清空session(用在用户注销和退出账号..)
            request.session.fiush()          #清空session(用在用户注销和退出账号..)

    request.session.delete(
    "session_key") #清空Session数据‘session_kry’对应的值 #手动设置数据库表中的cookie过期时间 request.session.set_expire(value) * 如果value是个整数,session会在value秒数后失效。 * 如果value是通过datatime或timedelta模块传入的时间(2019-06-12),session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,就是默认的两个周失效
    session中的cookie设置以及session的存放介质

    准备工作:
      在settings文件中,STATIC_URL='/STATIC/'下粘贴

           1. SESSION_ENGINE = 'django.contrib.sessions.backends.db'           # 默认引擎(session数据存放到数据库中)
                
         
                    SESSION_COOKIE_NAME = "sessionid"                       # 浏览器上cookie的key
                    SESSION_COOKIE_PATH = "/"                               # 在哪个url下cookie生效             (set_cookie用法相同)
                    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名         (set_cookie用法相同)
                    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie               (set_cookie用法相同)
                    SESSION_COOKIE_HTTPONLY = True                           # 是否cookie只支持http传输          (set_cookie用法相同)
                    SESSION_COOKIE_AGE = 1209600                             # cookie失效时间是多少秒(默认2周)
                    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期
                    SESSION_SAVE_EVERY_REQUEST = False                       # 每次登录更新一下cookie过期时间,反之不更新
                
        
                2. SESSION_ENGINE = 'django.contrib.sessions.backends.cache'   # 引擎(session数据存放到内存中)
                        SESSION_CACHE_ALIAS = 'default'                        #使用哪个内存                   
                                      
                        SESSION_COOKIE_NAME = "sessionid"                        
                        SESSION_COOKIE_PATH = "/"                               
                        SESSION_COOKIE_DOMAIN = None                              
                        SESSION_COOKIE_SECURE = False                             
                        SESSION_COOKIE_HTTPONLY = True                            
                        SESSION_COOKIE_AGE = 1209600                              
                        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   
                        SESSION_SAVE_EVERY_REQUEST = False                        
                
                3.  SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎(session数据存放到文件中)
                    SESSION_FILE_PATH = None                                    # 填写文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            
                                                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T                      
                    SESSION_COOKIE_NAME = "sessionid"                          
                    SESSION_COOKIE_PATH = "/"                                  
                    SESSION_COOKIE_DOMAIN = None                                
                    SESSION_COOKIE_SECURE = False                               
                    SESSION_COOKIE_HTTPONLY = True                              
                    SESSION_COOKIE_AGE = 1209600                                
                    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     
                    SESSION_SAVE_EVERY_REQUEST = False       
                
                4. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎(session数据存放到缓存和数据库中)       
                                                                                 #取session先取缓存,没有再去数据库找
                                    

    补充:
      关系型数据库:(基于硬盘的)
        sqllite mysql oracle db2

      菲关系型数据库:(基于内存的)
        redis, mongdb, memcahce

    
    

    中间件(类)

     ps:wsgiref是Django的wsgi.py文件,用于启动Django的socket服务器

    应用:
      做预处理的时候, 将代码写 在中间件中,
      来判断是否是IP黑名单中的值
      .....

    准备工作:

      1.自己在Django中建个文件

      2.在这个文件中写类

      3.添加中间件

     import m1,m2    
            - settings:
                MIDDLEWARE = [
                    'django.middleware.security.SecurityMiddleware',
                    'django.contrib.sessions.middleware.SessionMiddleware',
                    'django.middleware.common.CommonMiddleware',
                    'django.middleware.csrf.CsrfViewMiddleware',
                    'django.contrib.auth.middleware.AuthenticationMiddleware',
                    'django.contrib.messages.middleware.MessageMiddleware',
                    'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    'm1.M1',                        #自己写的中间件
                    'm2.M2'                         #自己写的中间件
                ]

    案例1:

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    class M1(MiddlewareMixin):
    
        def process_request(self, request):
            print('m1.process_request')
    
            return HttpResponse('回去吧 老弟')     #什么不写返回值为null,也可以写HttpResponse
    
        def process_response(self, request, response):
            print('m1.process_response')
    
            return response

    案例2:

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    class M1(MiddlewareMixin):
    
        def process_request(self, request):
            print('m1.process_request')
    
    
        def process_response(self, request, response):
            print('m1.process_response')
    
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            #view_func要访问视图函数的函数    view_args,view_kwargs是给要访问视图函数传参
            
            print(view_func, view_func.__name__)
            return HttpResponse('回去吧 老弟。。。')

    注: process_request : 请求必经的一个方法
       process_response: 这个响应必经的一个方法

     MTV 和 MVC

      项目目录结构的设计模式

        MVC(适用所有语言):    
                
                   浏览器------------------->  函数或者类处理  ------------------>  数据库
                                                   业务逻辑
                views:                         controllers                          models:
                大量html页面                    loginController.py                    LoginModel.py
                                                                    
                
            MVC
                
                django:
                    M : models 
                    T : Templates (各种html页面)            相当于views
                    V :Views(视图处理函数)               相当于 controllers
                
            
            
            客户       ------点餐-------->    服务员  ------处理菜单需求--------> 厨师
                       <------------------            <-------------------------    
            

     

  • 相关阅读:
    Flask基础教程
    htmlrunner-unittest生成多样的测试报告
    requestz-基于pycurl封装的requests库
    emailz-使发送邮件更方便
    filez-方便的数据文件加载器
    logz-易用的日志记录器
    基本语言(二)
    基本语言(一)
    编程范式(Programming paradigm)
    deque 双向队列知识点汇总
  • 原文地址:https://www.cnblogs.com/klw1/p/11209579.html
Copyright © 2011-2022 走看看