官网:https://www.djangoproject.com/ 博客:https://www.liujiangblog.com/ 本博客内容参考git:https://gitcode.net/mirrors/jackfrued/Python-100-Days 一些细节问题,大家可以查看git连接。本文主要的改变为把代码升级为django4.1版本。
Django静态文件问题备注: 参考: Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效 解决django 多个APP时 static文件的问题
django配置app中的静态文件步骤 Django多APP加载静态文件
django.short包参考:https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/
参考: 中间件的应用 https://docs.djangoproject.com/zh-hans/4.1/ref/middleware/ https://docs.djangoproject.com/zh-hans/4.1/topics/http/middleware/
中间件是 Django 请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变 Django 的输入或输出。 每个中间件组件负责做一些特定的功能。例如,Django 包含一个中间件组件 AuthenticationMiddleware,它使用会话将用户与请求关联起来。
在settings.py中有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
'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',
# 'debug_toolbar.middleware.DebugToolbarMiddleware', # 系列博客中按照的中间件
]
MIDDLEWARE配置项是一个有序列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。
django中间件是django的门户,有两大特征:
1、请求来的时候需要先经过中间件才能到达真正的django后端,注册列表从上至下依次检测; 2、响应走的时候最后也需要经过中间件才能发送出去,注册列表从下至上依次检测。
django中间件规律:
都继承MiddlewareMixin类,都有process前缀的方法。 也可使用函数的方法
在请求的过程中,上面的中间件会按照书写的顺序从上到下执行,然后是URL解析,最后请求才会来到视图函数;在响应的过程中,上面的中间件会按照书写的顺序从下到上执行,与请求时中间件执行的顺序正好相反。
首先django自带七个中间件,每个中间件都有各自对应的功能,django还支持程序员自定义中间件。 django支持程序员自定义中间件并且暴露给程序员五个可以自定义的方法。
process_request(self,request) # 请求相关 process_response(self, request, response) # 响应相关 process_view(self, request, callback, callback_args, callback_kwargs) # 路由层到视图层中间 process_template_response(self,request,response) # 视图层到模板层中间 process_exception(self, request, exception) # 视图函数出现异常
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
请求到达中间件之后,
1.在项目名或者应用名下创建一个任意名称的文件夹,如:mymiddlewear, 2.在该文件夹内创建一个任意名称的py文件,如:mymiddle 3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin),在这个类里面就可以自定义五个方法了,这五个方法并不是全部都需要书写,用几个写几个 4.需要将类的路径以字符串的形式注册到配置文件中才能生效;在应用下创建的,注册路径时有提示,项目下创建的则没有提示
在polls目录下创建mymiddlewear 在mymiddlewear目录下创建mymiddle.py文件
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from django.shortcuts import redirect
# 需要登录才能访问的资源路径
LOGIN_REQUIRED_URLS = {'/praise/', '/criticize/', '/excel/', '/teachers_data/','/get_echarts/'}
# django4.0版本后,没有is_ajax方法了
# 参考 https://www.itbaoku.cn/post/2409142.html
def is_ajax(request):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
class Check_Login(MiddlewareMixin):
def process_request(self,request):
# 请求的资源路径在上面的集合中
if request.path in LOGIN_REQUIRED_URLS:
# 会话中包含userid则视为已经登录
if 'userid' not in request.session:
# 判断是不是Ajax请求
# if request.is_ajax(request=request):
if is_ajax(request=request):
# Ajax请求返回JSON数据提示用户登录
return JsonResponse({'code': 10003, 'hint': '请先登录'})
else:
backurl = request.get_full_path()
# 非Ajax请求直接重定向到登录页
# return redirect(f'/login/?backurl={backurl}')
return redirect(f'/login/?backurl={backurl}')
def process_response(self, request, response):
print("MD1里面的 process_response")
return response
def process_view(self, request, view_func, view_args, view_kwargs):
print("-" * 80)
print("MD1 中的process_view")
print(view_func, view_func.__name__)
def process_exception(self, request, exception):
print(exception)
print("MD1 中的process_exception")
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
'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',
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
'polls.mymiddlewear.mymiddle.Check_Login', # 新增
]
访问
http://127.0.0.1:8000/
点击 教师信息下载,会跳转到登录页面
本文主要是Django系列博客。本文是Django中间件的应用。 使用中间件的步骤如下:
1.在项目名或者应用名下创建一个任意名称的文件夹,如:mymiddlewear, 2.在该文件夹内创建一个任意名称的py文件,如:mymiddle 3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin),在这个类里面就可以自定义五个方法了,这五个方法并不是全部都需要书写,用几个写几个 4.需要将类的路径以字符串的形式注册到配置文件中才能生效;在应用下创建的,注册路径时有提示,项目下创建的则没有提示