返回顶部

django 知识概括 (三)

什么时候用一对一?

  当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁
  把不怎么常用的字段 单独拿出来做成一张表 然后用过一对一关联起来

  OneToOneField(to="")

 

Django中内置了一个专门处理csrf问题的中间件

django.middleware.csrf.CsrfViewMiddleware
这个中间件做的事情:
在render返回页面的时候,在页面中塞了一个隐藏的input标签
我们在页面上 form表单 里面 写上 {% csrf_token %}

在django中装饰器的用法

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from functools import wraps
# Django提供的工具,把函数装饰器转变成方法装饰器
from django.utils.decorators import method_decorator


def check_login(func):
    @wraps(func)  # 装饰器修复技术
    def inner(request, *args, **kwargs):
        ret = request.session.get("is_login")
        # 1. 获取cookie中的随机字符串
        # 2. 根据随机字符串去数据库取 session_data --> 解密 --> 反序列化成字典
        # 3. 在字典里面 根据 is_login 取具体的数据
        if ret == "1":
            # 已经登陆过的 继续执行
            return func(request, *args, **kwargs)
        # 没有登录过的 跳转到登录页面
        else:
            # 获取当前访问的URL
            next_url = request.path_info
            print(next_url)
            return redirect("/app02/login/?next={}".format(next_url))
    return inner

  

 

登录时免除csrftoken 验证

@csrf_exempt
def login(request):

  

在函数和类视图中加装饰器

# @method_decorator(check_login, name="get")
class UserInfo(views.View):

    @method_decorator(check_login)
    def get(self, request):
        return render(request, "app02/userinfo.html")

def logout(request):
    # 只删除session数据
    # request.session.delete()
    # 如何删除session数据和cookie
    request.session.flush()
    return redirect("/app02/login/")

  

ajax发送请求

$.ajax({
            url: "/test/",
            type: "post",
            dataType: "json",
            traditional: true,
            data: {"name": "小黑", "sb":[1,2,3]},
            success: function (data) {
                // 把后端返回的数据反序列化成JS中的对象
                // var data = JSON.parse(data);
                if (data.status === 0){
                    // 这次请求成功
                    alert(data.data);
                }else {
                    // 请求出错
                    alert(data.error);
                }
            }
        })
    });

  

  

中间键

中间件的使用:
    5个固定的方法
        process_request(self, request)
            执行顺序:
                按照注册的顺序(在settings.py里面设置中 从上到下的顺序)
            何时执行:
                请求从wsgi拿到之后
            返回值:
                返回None,继续执行后续的中间件的process_request方法
                返回response , 不执行后续的中间件的process_request方法
                
        process_response
            执行顺序:
                按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
            何时执行:
                请求有响应的时候
            返回值:
                必须返回一个response对象
                
        process_view(self, request, view_func, view_args, view_kwargs):
            执行顺序:
                按照注册的顺序(在settings.py里面设置中 从上到下的顺序)
            何时执行:
                在urls.py中找到对应关系之后 在执行真正的视图函数之前
            返回值:
                返回None,继续执行后续的中间件的process_view方法
                返回response,
                
                
        process_exception(self, request, exception)
            执行顺序:
                按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
            何时执行:
                视图函数中抛出异常的时候才执行
            返回值:
                返回None,继续执行后续中间件的process_exception
                返回response,
                
                
                
        process_template_response(self, request, response)
            执行顺序:
                按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
            何时执行:
                视图函数执行完,在执行视图函数返回的响应对象的render方法之前 
            返回值:
                返回None,继续执行后续中间件的process_exception
                返回response,


    Django调用 注册的中间件里面五个方法的顺序:
        1. process_request
            urls.py
        2. process_view
            view
        3. 有异常就执行 process_exception
        4. 如果视图函数返回的响应对象有render方法,就执行process_template_response
        5. process_response

 

class OoXx(MiddlewareMixin):

    def process_request(self, request):
        print("这是我的第一个中间件:OoXx!")
        print(id(request))
        # print(request.path_info)
        # # 如果用户访问的URL 在 白名单里面
        # if request.path_info in URL:
        #     return
        # # 否则 直接返回一个 响应 不走视图那部分了
        # else:
        #     return HttpResponse("gun!")

    def process_response(self, request, response):
        """
        :param request: 是浏览器发来的请求对象
        :param response: 是视图函数返回的响应对象
        :return:
        """
        print("这是OOXX中间件里面的 process_response")
        # return response
        return HttpResponse("hahahaha")

    def process_view(self, request, view_func, view_args, view_kwargs):
        """

        :param request: 浏览器发来的请求对象
        :param view_func: 将要执行的视图函数的名字
        :param view_args: 将要执行的视图函数的位置参数
        :param view_kwargs: 将要执行的视图函数的关键字参数
        :return:
        """
        print("ooxx里面的process_view")
        print(view_func, type(view_func))
        return HttpResponse("ooxx:process_view")


    def process_exception(self, request, exception):
        print(exception)
        print("ooxx里面的process_exception")
        return redirect("http://www.luffycity.com")

    def process_template_response(self, request, response):
        print("ooxx 中的process_template_response")
        return response

  

importlib 使用

  根据字符串导入模 ,通畅用来导入包下面的模块

 

o = importlib.import_module("xx.oo") 
s2 = "Person"

  

 

posted @ 2018-10-12 00:17  Crazymagic  阅读(118)  评论(0编辑  收藏  举报