第一百零四节 中间件的原理和定义方式
models.py 代码
1 from django.db import models 2 3 class User(models.Model): 4 telephone = models.CharField(max_length=11) 5 username = models.CharField(max_length=20) 6 password = models.CharField(max_length=100)
setting.py 修改部分的代码
1 MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.SessionMiddleware', 4 'django.middleware.common.CommonMiddleware', # 限制请求头,重定向url 5 'django.middleware.csrf.CsrfViewMiddleware', 6 'django.contrib.auth.middleware.AuthenticationMiddleware', 7 'django.contrib.messages.middleware.MessageMiddleware', 8 'django.middleware.clickjacking.XFrameOptionsMiddleware', 9 'book.middlewares.book_user_middleware', # 将自定义的中间件注册 10 # 'book.middlewares.BookUserMiddleware', 11 12 ]
middlewares.py 自定义中间件代码
1 from book.models import User 2 3 # 中间件函数 4 def book_user_middleware(get_response): 5 # 执行一些初始化代码 6 print('中间件初始化的代码') 7 def middleware(request): 8 # 在这里写request到达视图函数所需要处理问题的代码 9 user_id = request.session.get('user_id') 10 if user_id: 11 try: 12 user = User.objects.get(pk=user_id) 13 request.book_user = user 14 except: 15 request.book_user = None 16 else: 17 request.book_user = None 18 print('request到达view之前执行的代码') 19 response = get_response(request) # 这一句相当于是在执行视图函数 20 # response对象到达浏览器之前执行的代码 21 print('response到达浏览器之前执行的代码') 22 return response 23 return middleware 24 25 26 # 中间件类 27 # class BookUserMiddleware(object): 28 # def __init__(self, get_response): 29 # # 执行一些初始化代码 30 # print('中间件初始化的代码') 31 # self.get_response = get_response 32 # 33 # def __call__(self, request): 34 # # 在这里写request到达视图函数所需要处理问题的代码 35 # user_id = request.session.get('user_id') 36 # if user_id: 37 # try: 38 # user = User.objects.get(pk=user_id) 39 # request.book_user = user 40 # except: 41 # request.book_user = None 42 # else: 43 # request.book_user = None 44 # print('request到达view之前执行的代码') 45 # response = get_response(request) # 这一句相当于是在执行视图函数 46 # # response对象到达浏览器之前执行的代码 47 # print('response到达浏览器之前执行的代码') 48 # return response
view.py 代码
1 from django.shortcuts import render, HttpResponse, redirect, reverse 2 from book.models import User 3 from django.contrib import messages 4 from django.views import View 5 6 def index(request): 7 # print(request.book_user.username) 8 return HttpResponse('index') 9 10 def my_list(request): 11 return HttpResponse('my list') 12 13 class SigninView(View): 14 def get(self, request): 15 return render(request, 'login.html') 16 17 def post(self, request): 18 username = request.POST.get('username') 19 password = request.POST.get('password') 20 user = User.objects.filter(username=username, password=password).first() 21 if user: 22 request.session['user_id'] = user.id 23 return redirect(reverse('index')) 24 else: 25 messages.info(request, '用户名或者密码错误!') 26 return redirect(reverse('login')) 27 28 class RegisterView(View): 29 def get(self, request): 30 return render(request, 'register.html') 31 32 def post(self, request): 33 user = User() 34 username = request.POST.get('username') 35 password = request.POST.get('password') 36 telephone = request.POST.get('telephone') 37 user.username = username 38 user.password = password 39 user.save() 40 return redirect(reverse('index'))
urls.py 代码
from django.urls import path from book import views urlpatterns = [ path('', views.index, name='index'), path('list/', views.my_list, name='list'), path('signin/', views.SigninView.as_view(), name='login'), path('register/', views.RegisterView.as_view(), name='register'), ]
register.html 注册页面HTML代码
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="" method="post"> 9 {% csrf_token %} 10 <table> 11 <tbody> 12 <tr> 13 <td>用户名:</td> 14 <td><input type="text" name="username"></td> 15 </tr> 16 <tr> 17 <td>密码:</td> 18 <td><input type="password" name="password"></td> 19 </tr> 20 <tr> 21 <td>手机号码:</td> 22 <td><input type="text" name="telephone"></td> 23 </tr> 24 <tr> 25 <td></td> 26 <td><input type="submit" value="提交"></td> 27 </tr> 28 29 </tbody> 30 </table> 31 </form> 32 </body> 33 </html>
login.html 登录页面HTML代码
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="" method="post"> 9 {% csrf_token %} 10 <table> 11 <tbody> 12 <tr> 13 <td>用户名:</td> 14 <td><input type="text" name="username"></td> 15 </tr> 16 <tr> 17 <td>密码:</td> 18 <td><input type="password" name="password"></td> 19 </tr> 20 <tr> 21 <td></td> 22 <td><input type="submit" value="提交"></td> 23 </tr> 24 <tr> 25 <td></td> 26 <td> 27 {% for message in messages %} 28 {{ message }} 29 {% endfor %} 30 </td> 31 </tr> 32 </tbody> 33 </table> 34 </form> 35 </body> 36 </html>