(django)09 django中间件和两种视图

django中间件

1.基本中间件

在settings.py中配置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2.自定义中间件

process_request(self,request) # 作用在请求被路由处理之前
process_view(self, request, view_func, view_args, view_kwargs) # 作用在视图渲染之前
process_exception(self, request, exception) # 作用在异常处理之前
process_response(self, request, response) # 作用在响应之前

(0)注册中间件

修改settings.py

MIDDLEWARE = [
    ······
    'middlewaretest.middlewares.MyMiddleware',
]

(1)定义middlewares.py

class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("MyMiddleware  process_request 方法:", id(request)) #在视图之前执行

    def process_response(self,request, response): #基于请求响应
        print("MyMiddleware  process_response 方法:", id(request)) #在视图之后
        return response

    # 在这里修改正则url传来的参数pk
    def process_view(self,request, view_func, view_args, view_kwargs):
        print("MyMiddleware  process_view 方法:", id(request)) #在视图之前执行 顺序执行
        print("view_func: ",view_func.__name__)
        print("view_args:  ",view_args)
        print("view_kwargs:  ", view_kwargs)

        # 这里hook修改特定的视图函数
        if view_func.__name__=='book_detail':
            view_kwargs['pk']='1'
        # return view_func(request) # 这里return的话,会替代掉原有的视图函数


    def process_exception(self, request, exception):#引发错误 才会触发这个方法
        print("MyMiddleware  process_exception 方法:")
        # return HttpResponse(exception) #返回错误信息

(2)重点看看process_view

结合后文中的正则url传参,链接: (django)10 django restful api

url(r'^api/book/(?P<pk>[0-9]+)$', book_detail),

这个路由调用视图函数时会有一个形参pk

@api_view(['GET', 'PUT', 'DELETE'])
def book_detail(request, pk):
    print("pk:  ",pk)
    ······

在这里,可以通过hook打印出pk,效果如图:
请添加图片描述

请添加图片描述

django 视图

1.基于函数的视图

from django.shortcuts import render,HttpResponse

def login(request):
    # 如果是GET方式
    if request.method=='GET':
        return HttpResponse("GET请求的响应")

    # 如果是POST方式
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    if user == "alexw" and pwd == "alexw123":
        return HttpResponse("认证成功的POST!!!")
    else:
        return HttpResponse("认证失败的POST。。。")

效果

请添加图片描述
请添加图片描述

2.基于类的视图

from django.shortcuts import render,HttpResponse
from django.views import View

# Create your views here.


class Login(View):
    def get(self,request):
        return HttpResponse("GET请求的响应")

    def post(self,request):
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "alexw" and pwd == "alexw123":
            return HttpResponse("认证成功的POST!!!")
        else:
            return HttpResponse("认证失败的POST。。。")
  • 需要继承View基类

效果

请添加图片描述请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django1.8中间件是一个非常有用的功能,它允许你在Django请求和响应的处理过程中,插入自己的代码逻辑。下面是Django1.8中间件的几种魔术方法: 1. `__init__(self, get_response=None)`:这个方法在中间件实例化时被调用,它接收一个可选的get_response参数,用于保存Django的请求处理链的下一个中间件的引用。 2. `process_request(self, request)`:这个方法在Django处理请求之前被调用,它接收一个request参数,代表当前的请求对象。如果这个方法返回一个HttpResponse对象,Django将不会执行后续的请求处理过程,而是直接将这个HttpResponse对象返回给客户端。 3. `process_view(self, request, view_func, view_args, view_kwargs)`:这个方法在Django执行视图函数之前被调用,它接收4个参数,分别是当前的请求对象request、即将执行的视图函数view_func、视图函数的位置参数view_args和关键字参数view_kwargs。如果这个方法返回一个HttpResponse对象,Django将不会执行后续的请求处理过程,而是直接将这个HttpResponse对象返回给客户端。 4. `process_template_response(self, request, response)`:这个方法在Django执行视图函数并且视图函数返回一个TemplateResponse对象后被调用,它接收两个参数,分别是当前的请求对象request和视图函数返回的TemplateResponse对象response。如果这个方法返回一个HttpResponse对象,Django将不会执行后续的请求处理过程,而是直接将这个HttpResponse对象返回给客户端。 5. `process_response(self, request, response)`:这个方法在Django执行视图函数并且处理完所有的中间件后被调用,它接收两个参数,分别是当前的请求对象request和视图函数返回的HttpResponse对象response。如果这个方法返回一个HttpResponse对象,Django将不会执行后续的请求处理过程,而是直接将这个HttpResponse对象返回给客户端。 6. `process_exception(self, request, exception)`:这个方法在Django执行视图函数时抛出异常后被调用,它接收两个参数,分别是当前的请求对象request和抛出的异常对象exception。如果这个方法返回一个HttpResponse对象,Django将不会执行后续的请求处理过程,而是直接将这个HttpResponse对象返回给客户端。 以上是Django1.8中间件的几种魔术方法,你可以根据自己的需求选择实现其中的一些或全部方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值