django框架第二天
一、类视图
1.1 创建类视图
- view.py
class orderView(View):
def get(self, request):
return HttpResponse('get 请求')
@csrf_exempt
def post(self,request):
return HttpResponse('post 请求')
def delete(self,request):
return HttpResponse('delete 请求')
def put(self,request):
return HttpResponse('put 请求')
- urls.py
app_name = 'viewappp'
urlpatterns=[
path('orderstart',csrf_exempt(views.orderView.as_view()), name='orderuser')
]
- 请求
http://127.0.0.1:8000/view/orderstart
二、中间件
2.1 概念
基于AOP的思想理念
2.2 勾子函数
- process_request()
从django框架到urls路由过程 - process_view()
从urls路由到view视图函数的过程 - proceess_temolate_response
在view视图中渲染模板的过程 - process_exception()
从请求到响应的过程中,发生了异常,则会在这里处理 - process_response()
从视图函数中向django响应数据时,即返回HttpResponse()对象后
3.3 中间件的简单案例
- 中间件处理类
from django.utils.deprecation import MiddlewareMixin
class CheckLoginWare(MiddlewareMixin):
def process_request(self,request):
print('process_request')
#从请求到路由urls过程,出发此函数
if request.path == '/user/login':
print('登陆页面进行登录')
else:
print('其他的页面')
print(request.path, request.COOKIES)
def process_view(self, request, callback, callback_args,callback_kwargs):
print(callback,callback_args,callback_kwargs)
#进行传参 http://localhost:8000/view/orderstart?name='cjka'
callback_kwargs['name'] = 'rose'
#callback_kwargs['name'] = request.GET.get('name','NO-args')
print('process_view')
def process_response(self,request,response):
print('process_response')
return response
- settings.py文件中添加中间件处理类
MIDDLEWARE = [
'middleware.check_login.CheckLoginWare'
]
- 请求
http://127.0.0.1:8000/user/login
- 输出结果
process_request
登陆页面进行登录
/user/login {
}
process_response
Not Found: /user/login
- 中间件的异常处理
def process_exception(self,request,exception):
print(exception)
print('处理业务中出现了异常')
return HttpResponse('出现了异常')
三、Django日志系统
3.1 日志的组成部分
- 日志的版本号 version
- 日志的格式化 formatterns
- 日志的处理器 handlers
- 日志的记录器 loggers,默认存在django。server,django.request
- 日志的过滤器 filters
3.2 配置日志
- settings.py文件中配置日志
#配置django日志
#LOGGING是固定的
LOGGING = {
#version必须加
'version':1.0,
'formatters':{
'base':{
'format':'[%(asctime)s %(name)s] %(message)s',
'datefmt':'%Y-%m-%d %H时%M分%S秒'
}
},
'handlers':{
'out':{
'class':'logging.StreamHandler',
'level':'INFO',
'formatter':'base'
},
'file':{
'class':'logging.FileHandler',
'level':'WARNING',
'formatter':'base',
'filename':f'{
BASE_DIR}/warn.log'
}
},
#记录器
'loggers':{
'django':{
'handlers':['out', 'file'],
'level':'INFO',
'propagate':'True'
}
}
}
- 自己输出日志
ip = request.META.get('REMOTE_ADDR')
path = request.get_raw_uri()
msg = "%s 访问 %s"%(ip, path)
logging.getLogger('django').info(msg)
- 产看结果
[2021-08-26 18时02分56秒 django] 127.0.0.1 访问 http://127.0.0.1:8000/view/orderstart
process_response
[2021-08-26 18时02分56秒 django.server] "GET /view/orderstart HTTP/1.1" 200 10
四、缓存
4. 1缓存配置
CACHE = {
'default':{
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION':f'{
BASE_DIR}/mycache',
'OPTIONS':{
'MAX_ENTRIES':500,
'TIMEOUT':300,
'CULL_FREQUENCY':3
}
}
}
4.2 文件缓存的使用
from django.core.cache import cache
cache.has_key('key_name')
cache.set()
cache.get()
cache.delde("key_name")
cache.add('phone','123456',timeout=300)
True
4.3 页面缓存
4.3.1 @cache_page
@cache_page(timeout=10,cache='html',key_prefix='page')
def list(request):
num = random.randint(0,10)
return HttpResponse('当前页面会缓存30s%s'%num)
4.3.2 使用中间件的方式,结合cache.set/add()缓存html
- 在请求时判断页面是否缓存,缓存了则返回,不进行下一步,将后端渲染好的页面进行缓存
-cache_page.py文件
from django.core.cache import cache
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class CachePageMiddleware(MiddlewareMixin):
#缓存的页面的路径
cache_page_path=[
'/user/list'
]
def process_request(self,request):
#判断当前的请求是否需要被缓存
if request.path in self.cache_page_path:
#判断页面是否已经缓存
if cache.has_key(request.path):
return HttpResponse(cache.get(request.path))
pass
def process_response(self,request,response):
# 判断当前的请求是否支持缓存
if request.path in self.cache_page_path:
#开始缓存
cache.set(request.path,response.content,timeout=5)
return response
- settings.py文件中配置中间件文件
MIDDLEWARE = [
......
'middleware.cache_page.CachePageMiddleware'
]
4.4 redis缓存
- 安装django-redis
pip install django-redis
- 配置django_redis
CACHES={
'default':{
'BACKEND':'django_redis.cache.RedisCache',
'LOCATION':'redis://127.0.0.1:6379/1',
'OPTIONS':{
'CLIENT_CLASS':'django_redis.client.DefaultClient',
'SOCKET_CONNECT_TIMEOUT':10,
'SOCKET_TIMEOUT':10,
}
}
}
4.5 session缓存
- 配置session缓存
#配置session
SESSION_ENGINE='django.contrib.sessions.backends.cache'
SESSION_COOKIE_NAME = 'SESSION_ID'
SESSION_COOKIE_PATH = '/'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600 #2周有效时间
4.6 django信号机制
- 信号的概念
django会在一些特定的行为后释放一些可以接受的信号 - 信号处理的举例,比如删除数据库的一项数据时会释放pre_delete信号
from django.dispatch import receiver
#第一种对信号处理的方式
def model_delete_pre(sender, **kwargs):
# sender 表示哪一个Modeld的对象将要被删除
print(sender)
# kwargs 表示信号的基本信息,信号发送时传递的一些信息
print(kwargs)
pre_delete.connect(model_delete_pre)
##第二种对信号处理的方式
@receiver(post_delete)
def delete_post(sender,**kwargs):
print(sender)
print(kwargs)
- python console的结果
User.objects.filter(pk=2).delete()
<class 'userapp.models.User'>
{
'signal': <django.db.models.signals.ModelSignal object at 0x000002A774A62DF0>, 'instance': <User: User object (2)>, 'using': 'default'}
<class 'userapp.models.User'>
{
'signal': <django.db.models.signals.ModelSignal object at 0x000002A774A62F10>, 'instance': <User: User object (2)>, 'using': 'default'}
(1, {
'userapp.User': 1})
4.7 自定义信号
- 定义信号
#定义信号
from django import dispatch
codeSignal = dispatch.Signal(providing_args=['path','phone','code'])
- 发送信号
#发送信号,参数列表要对应
signal_.codeSignal.send('zhangsan',path=request.path,phone='123',code='sd44')
- 接收信号
from signal_ import codeSignal
from django import dispatch
@dispatch.receiver(codeSignal)
def cache_code(sender, **kwargs):
print('自定义信号')
print(sender)
print(kwargs)