Django 08.16

1.模板引擎

基本数据类型的渲染

  • 字符串|整数|小数
  • 列表
  • 字典
  • 列表套字典

母版

​ 后台管理页面 : layout.html

<--!后台管理页面 : #layout.html-->

{% block mycontent %}
{% endblock %}

{% block mycss %}
{% endblock %}

{% block myjs %}
{% endblock %}
    
<--!子版页面需要继承母版页面-->
    
{% extends "layout.html"%}
 
{% block_mycontent %}
    子版自己的内容
{% endblock %}
    
    
<--!导入模块 include-->
pathon : import ...
    
Django {% include "html的页面"%}
#内置函数

##自定义函数
a.在app中创建templatetags目录
b.在上述app中创建xxx.py
c.在xxx.py中:
    
from django import template
register = template.Library()

@register.filter
def my_filter(val,args):
    return val + args

@register.simple_tag
def my_upper(val,args,args1):
    return val + args + args1
{% load xxx %}

<--!simple_filter-->
    {{name | my filter:"xxxxx"}}

<--!simple_tag-->
    {% my_upper "zekai" "sss" "das"%}
    
上述filter只能传入一个参数,而simpletag可以传入多可参数
不建议大家在模板中使用函数, 因为会降低模板的渲染效率, 建议大家在视图处理函数中直接处理, 然后渲染即可   

2.session cookie

#设置session

login:##向客户端回写一个cookie值
'" 
1.在客户端回写一个{session:lr3gmj3vpt0ytf7locqnb21p0cg63iek'}
2.将客户的隐私信息保存在了服务器的数据库中,也就是session保存在了数据库中,默认放在django_session表中{"dsjnalndjskanjdksa" : {"name":'zekai', 'age':12, 'addr':'dsabdsa'}}"'

          
设置session:          
request.session['name'] = username
request.session['age'] = 13
           
获取session
request.session.get('name')

cookie和session的区别
1.cookie存在于客户端,session存在于服务端;
2.cookie存储的一般是一个身份的ID,session一般存储的都是用户的隐私问题        

3.中间件

自定制中间件

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_response(self, request, response)

以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

process_request

process_request有一个参数,就是request,这个request和视图函数中的request是一样的(在交给Django后面的路由之前,对这个request对象可以进行一系列的操作)。

由于request对象是一样的,所以我们可以对request对象进行一系列的操作,包括request.变量名=变量值,这样的操作,我们可以在后续的视图函数中通过相同的方式即可获取到我们在中间件中设置的值。

它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。

process_response

多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,也就是说第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后一个执行,它的process_response方法是最先执行。

process_view

process_view(self, request, view_func, view_args, view_kwargs)

该方法有四个参数

  • request是HttpRequest对象。
  • view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
  • view_args是将传递给视图的位置参数的列表.
  • view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数之前调用process_view方法。

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器

中间件执行流程

请求到达中间件之后,先按照正序执行每个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法(注意不是掉头执行所有的process_response方法),将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。

ZOZRu4.png

process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。

ZOZWDJ.png

django 生命周期

MVC和MTV

MVC:
    客户----->                 服务员              ----->厨师
 模板页面(HTML页面)    函数处理业务请求          数据库(models)
 模板页面(Views)   		控制器(control)			(models)										
MTV:
 django:
    M(model): models
    T(template): Views
    V(views):control    

CSRF,xss,sql注入

csrf:跨站请求伪造攻击
    
{% csrf_token %}
a.开启全局的csrf验证,打开注释
1,在settings中,打开注释'django.middleware.csrf.CsrfViewMiddleware',
2.表单中,开启csrf_token

<form action="/test3/" method="post">
    {% csrf_token %}
    username: <input type="text" name="username">
    <input type="submit" value="提交">
</form>

b.局部的函数,不进行csrf验证
1,在settings中,打开注释'django.middleware.csrf.CsrfViewMiddleware',
2.在views中,
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def test2(request):
    return render(request, "test2.html")

c,除特定外,其余都不需要验证:
1,在settings中,释'django.middleware.csrf.CsrfViewMiddleware',
2.在views中:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def test3(request):
    return render(request, 'test3.html')

d.CBV

from django.views import View
from django.utils.decorators import method_decorator

@method_decorator(csrf_protect, name='get')
class Test4(View):
    def get(self):
        pass
    def post(self):
        pass
    
e:ajax
    headers:{X-CSRFToken:token}
        
    $.ajax({
        type:"POST",
        url:"/test/",
        data:{"name":"xxxx"},
        
    })
posted @ 2019-08-16 23:33  海森t  阅读(34)  评论(0)    收藏  举报