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)

猜你喜欢

转载自blog.csdn.net/qq_42306803/article/details/119927869