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"

浙公网安备 33010602011771号