Django 12 中间件、上下文处理器和admin后台

Django 12 中间件、上下文处理器和admin后台

一、中间件

#Django中间件 (Middleware)
# 一个轻量级、底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入和输出

  中间件的执行顺序

#请求以自上而下的顺序通过所有的层,view函数处理过后,响应以自下而上的顺序通过所有的层,期间经过的各个中间件都会对请求和响应进行处理

  中间件的结构

#中间件中可以定义5个方法,分别是:

#执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_request(self,request) 

#调用视图函数之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_view(self,request,callback_args,callback_kwargs) 

#在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
process_template_response(self,request,exception) 

#当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
process_exception(self,request,exception)

#所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
process_response(self,request,response)

  中间件的配置

#1、在项目目录下创建一个middleware.py文件

#2、配置方法一
from django.utils.deprecation import MiddlewareMixin  #中间件的类
from django.http import HttpResponse
class MyException(MiddlewareMixin):

    def process_request(self,request): #方法名是固定的
        print('这是自定义的process_request')
        return None #因为没有结束,所以不需要返回响应

    def process_view(self,request,callback,args,kwargs):
        print('这是自定义的process_view')
        return None

    def process_exception(self,request,exception):
        return HttpResponse(exception)

#这几种方法可以按需求来配置,并不是都需要配置

#2、配置方法二
from test22.models import User
class UserMiddleWare(object):
    def __init__(self,get_response):
        self.get_response = get_response

    def __call__(self,request):
        username = request.session.get('username','未登录')
        user = User.objects.filter(username=username).first()
        if user:
            setattr(request,'my_user','user.username') #给request这个对象添加一个名为myuser的属性,属性内容为user.username
        else:
            setattr(request,'my_user','游客')
        response = self.get_response(request) #这是request和response的分界线;前面的是到达视图函数之前执行,后面的是到达浏览器之前执行

        return response #必须给一个响应

#3、注册中间件
    #在settings.py里面的MIDDLEWARE里面添加上面两个类
    'myblog.middleware.MyException',
    'myblog.middleware.UserMiddleWare',

 

二、上下文处理器

  为了满足在多个模板里面都能使用某个变量,在上下文处理器中设置这个变量即可

#在模板中想要使用的变量是从视图函数中的context这个上下文的参数中传递进来的,每个视图函数需要什么参数就传什么参数.

#上下文处理器就是创建模板变量.

#1、在项目目录下创建一个xx.py文件(一般取名为processcontent.py)

#2、在该文件中添加函数

from test22.models import User
def my_user(request):
    username = request.session.get('username','未登录') #获取session的username
    user = User.objects.filter(username=username).first() #验证数据库是否有这个username
    if user:
        return {'my_user':user.username} #返回的必须是字典类型
    else:
        return {'my_user':'游客'}

#3、注册
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'myblog.myprocesscontent.my_user', #项目名-py文件名-函数名(这一条就是注册)
            ],
        },
    },
]

  总结

#我们用中间件和上下文处理器完成了跟登录用户有关的例子, 最后的结果都是能在页面上显示用户的用户名了.
#中间件是在用户请求到响应的过程中去加入一些额外的逻辑功能,
#例子中给request增加了一个myuser的属性.
#上下文是给所有的模板增加变量
#例子中给模板增加了一个myuser的变量.

三、admin后台

  admin后台介绍

#为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模型创建后台界面。

#Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。
#Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。
#管理界面不是为了网站的访问者,而是为管理者准备的。

  admin创建用户

manage python createsuperuer #创建超级用户(管理员) 然后按步骤写入username、email、password

   修改admin内语言、时区,settings.py里面

  在app里面的admin.py写入

from django.contrib import admin

# Register your models here.

from .models import Department,Student,Stu_Detail,Course

class DepartmentAdmin(admin.ModelAdmin):
    list_display = ['d_id','d_name'] #按表格的形式来排列
    list_display_links = ['d_id','d_name'] #表示给这两列数据加上a标签
    list_filter = ['d_id'] #以d_id来过滤
    search_fields = ['d_name'] #以d_name来搜索

class Stu_DetailAdmin(admin.ModelAdmin):
    fields = ['student','age','city'] #分组1
    fieldsets = [
        ('第一组',{'fields':'student'}),
        ('第一组', {'fields': ['age','city','gender']}), #分组2

    ]



admin.site.register(Department,DepartmentAdmin)  #注册
admin.site.register(Student)
admin.site.register(Stu_Detail,Stu_DetailAdmin)
admin.site.register(Course)

 

posted on 2018-08-10 16:24  许铖铖  阅读(463)  评论(0编辑  收藏  举报