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
            
        
        
        客户       ------点餐-------->    服务员  ------处理菜单需求--------> 厨师
                   <------------------            <-------------------------    
        

 

原文地址:https://www.cnblogs.com/klw1/p/11209579.html