第一百零四节 中间件的原理和定义方式

 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>

 

posted @ 2020-03-13 23:15  kog_maw  阅读(144)  评论(0编辑  收藏  举报