1、小知识点
1.1常用端口总结
类型 | 端口 |
SSH | 22 |
HTTP | 80 |
HTTPS | 443 |
MySQL | 3306 |
类型 | 端口 |
Redis | 6379 |
Django | 8000 |
Flask | 5000 |
1.2session操作
clear()只清除键对应的值,而flush()键和值都会删除
通过HttpRequest对象的session属性进行会话的读写操作。
1)以键值对的格式写session。(重点掌握)
request.session['键']=值
2)根据键读取值。(重点掌握)
request.session.get('键',默认值)
3)清除所有session,在存储中删除值部分。
request.session.clear()
4)清除session数据,在存储中删除session的整条数据。
request.session.flush()
5)删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session['键']
6)设置session的有效期
request.session.set_expiry(value)
1、如果value是一个整数,session将在value秒没有活动后过期。
2、如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
3、如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
2.类视图和中间件
2.1类视图
2.1.1函数视图
1def register(request): 2 """注册视图""" 3 if request.method == 'GET': 4 # 显示注册页面 5 else: 6 # 进行注册处理
1)函数式图的代码过多,业务逻辑不清晰。工作中,一个函数代码不要过长,不应该超过100行。
2)代码重用性比较差。类视图就可以通过继承来重用一些代码
2.1.2类视图
好处:
1)代码可读性好。
2)类视图相对于函数视图有更高的复用性。想复用,直接进行继承即可。
类视图注意:
1)类视图继承一个父类View
2)支持哪些请求方式,就定义哪些方法。比如支持get,定义get方法。
1from django.views.generic import View 2 3class RegisterView(View): 4 """类视图:处理注册""" 5 6 def get(self, request): 7 """处理GET请求,返回注册页面""" 8 return render(request, 'register.html') 9 10 def post(self, request): 11 """处理POST请求,实现注册逻辑""" 12 return HttpResponse('这里实现注册逻辑')
类视图使用(必须掌握):
1)先在视图中定义一个类视图,继承View;
2)然后,定义get、post等方法,如果是哪个请求方式,对应的用哪个方法处理业务。
3)创建urls,然后定义一个列表urlpatterns
,
4)在列表中,配置一下视图地址。
url(r'^register/$', views.RegisterView.as_view(), name='register')
5)在总的url中进行一个包含。
类视图的原理(扩展):
原理中用到的一个小知识点:
定义一个类视图后,先创建一个对象
handler = getattr(类创建出来的对象名,'对象的方法名')
获取一个对象的属性
再调用这个handler()
也可以调用对象的这一方法
原理:
url(r'^register/$', 类视图as_view方法的返回值)
中调用了类视图的as_view方法,as_view方法返回的是view方法的调用;view方法返回的是dispatch这个方法的调用;调用这个方法的时候,里面进行了一个处理(先获取了请求方法request.method
,然后再利用lower()
方法转成小写,比如‘GET’变成‘get’,其实就是根据不同的请求方法获取类视图中对应的请求方法);然后再调用对应的方法,将处理结果返回给view调用的地方。最后返回应答。
2.1.3装饰器
给函数视图加装饰器:
给类视图加装饰器:
两种方式:
1、直接在url配置时手动调用装饰器函数来实现装饰器添加。
2、使用Django框架提供的method_decorator
将针对函数视图装饰器添加到类视图的方法上面。
为类视图添加装饰器,可以使用上面两种方法。
为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。
1def my_decorator(func): 2 def wrapper(request, *args, **kwargs): 3 print('自定义装饰器被调用了') 4 print('请求路径%s' % request.path) 5 return func(request, *args, **kwargs) 6 return wrapper 7 8class DemoView(View): 9 def get(self, request): 10 print('get方法') 11 return HttpResponse('ok') 12 13 def post(self, request): 14 print('post方法') 15 return HttpResponse('ok')
在URL配置中装饰
1urlpatterns = [ 2 url(r'^demo/$', my_decorate(DemoView.as_view())) 3]
此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。
在类视图中装饰
在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。
method_decorator装饰器使用name参数指明被装饰的方法
1# 为全部请求方法添加装饰器 2# name可以不写,直接写值 3@method_decorator(my_decorator, name='dispatch') 4class DemoView(View): 5 def get(self, request): 6 print('get方法') 7 return HttpResponse('ok') 8 9 def post(self, request): 10 print('post方法') 11 return HttpResponse('ok') 12 13 14# 为特定请求方法添加装饰器 15# name可以不写,直接写值 16@method_decorator(my_decorator, name='get') 17class DemoView(View): 18 def get(self, request): 19 print('get方法') 20 return HttpResponse('ok') 21 22 def post(self, request): 23 print('post方法') 24 return HttpResponse('ok')
如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),可以直接在需要添加装饰器的方法上使用method_decorator,如下所示
1from django.utils.decorators import method_decorator 2 3# 为特定请求方法添加装饰器 4class DemoView(View): 5 6 @method_decorator(my_decorator) # 为get方法添加了装饰器 7 def get(self, request): 8 print('get方法') 9 return HttpResponse('ok') 10 11 @method_decorator(my_decorator) # 为post方法添加了装饰器 12 def post(self, request): 13 print('post方法') 14 return HttpResponse('ok') 15 16 def put(self, request): # 没有为put方法添加装饰器 17 print('put方法') 18 return HttpResponse('ok')
Mixin扩展类:将一些通用的功能代码封装到不同的父类中,子类中需要哪些功能,就可以直接继承对应的父类,抽取的父类就是Mixin扩展类。(目前仅作为了解,DRF框架中会用)
总结
本质:访问一个url地址可以采用不同的请求方式,当使用不同的请求方式请求同一个url地址的时候,就会调用类视图中对应的方法。
好处:代码复用性好;业务逻辑代码更加清晰。
使用:定义类视图(继承自View;支持哪些请求方式,定义哪些请求方法),进行url配置(注意一个方法.as_view()
)
2.2中间件
中间件相当于Flask里面的钩子函数:可以在请求之前或者请求之后做一些处理。
首先回顾一下Flask里面的钩子函数:
1@before_first_requst 2def method_funcn1(...): 3 pass 4 5@before_request 6def method_func2(...): 7 pass 8 9@after_request 10def method_func3(...): 11 pass 12 13@teardown_request 14def method_func4(...): 15 pass
中间件有一个固定的模板,这个模板不需要记忆,我们用的时候直接进行复制即可,我们要知道的是我们在模板哪里添加我们需要的代码:
1def simple_middleware(get_response): 2 # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 3 4 def middleware(request): 5 # 此处编写的代码会在每个请求处理视图前被调用。 6 7 response = get_response(request) 8 9 # 此处编写的代码会在每个请求处理视图之后被调用。 10 11 return response 12 13 return middleware
2.2.1Django里面中间件使用
1、定义一个中间件
在随便一个子应用中新建一个middleware.py文件,
1def my_middleware(get_response): 2 print('init 被调用') 3 def middleware(request): 4 print('before request 被调用') 5 response = get_response(request) 6 print('after response 被调用') 7 return response 8 return middleware
2、定义好中间件后,需要在settings.py 文件中添加注册中间件
1MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.SessionMiddleware', 4 'django.middleware.common.CommonMiddleware', 5 # 'django.middleware.csrf.CsrfViewMiddleware', 6 'django.contrib.auth.middleware.AuthenticationMiddleware', 7 'django.contrib.messages.middleware.MessageMiddleware', 8 'django.middleware.clickjacking.XFrameOptionsMiddleware', 9 'users.middleware.my_middleware', # 添加中间件 10]
3、定义一个视图进行测试
1def demo_view(request): 2 print('view 视图被调用') 3 return HttpResponse('OK')
注意:在调试模式下,init部分有可能会被调用两次
2.2.2多个中间件代码执行顺序(了解)
多个中间件,init部分调用的顺序和中间件的注册顺序相反。
before_request部分代码调用的顺序和中间件注册顺序相同。
after_request部分代码调用的顺序和中间件注册顺序相反。
2.2.3使用场景
中间件最常用的地方就是在请求前,进行CSRF校验,进行黑名单的处理。
2.2.3注意
中间件是全局的,不论你写在哪个子应用里面,工程里面所有的子应用的视图都会使用。
Django里面的中间件有所了解即可,知道怎么使用。在公司里中间件一般不会由普通员工书写。