django 中间件 request.path 与get_full_path

来源:互联网 发布:淘宝开店费用怎么算 编辑:程序博客网 时间:2024/05/20 00:53

中间件的用途一:可以记录请求的url,应用场景:当客户输入用户中心或购物车的网址,如果客户还没有登录,就跳转到登陆页面,登录后直接进入客户刚才输入的用户中心或购物车,所以需要中间件记录客户请求的url,但不记录登录的url,这时,要进行判定url,再做记录。

如何使用中间件:1在应用(如df_user)中创建middleware.py文件,写中间件类(如UrlPathMiddleWare),类名自定义,其中中间件的函数必须是下面中的,名字一致

2 在项目中settings中注册中间件:

MIDDLEWARE_CLASSES = (
  'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'df_user.middleware.UrlPathMiddleWare',
)


中间件类(例子):

class UrlPathMiddleWare():


    #处理视图前中间件函数,会将静态文件路径去除,剩下真正能匹配视图的url,所以选择这个中间件
    def process_view(self, request, view_func, view_args, view_kwargs):



    # 在开发阶段,没有部署nginx时,当请求的网页中的静态文件没找到时,url后面就会加上静态文件的路径,
    # 导致在下面的函数中进行列表中元素判断时,无法排除,如果真实运行后,部署了nginx,静态文件加载就不会走uwsig这条路
    # 处理请求前的中间件函数
    # def process_request(request):



        # 这是获得全路径的一个方法 /user/register_name/?name=frank 后面携带参数
        # path = request.get_full_path()


        # 这是获得路径的一个属性 /user/register_name/ 后面不携带参数
        path = request.path


        # print(path + 'hsssss')
        if path not in ['/user/login/', '/center/is_login/', '/user/register/',
                    '/user/register_handle/', '/user/login_handle/',
                    '/user/register_name/','/',  ]:
            request.session['url_path'] = path
            # print(path+'haha')
        # else:
        #     request.session['url_path'] = '/user/login/'





提供的六个函数如下:

  • 1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
def __init__():    pass
  • 2.处理请求前:在每个请求上调用,返回None或HttpResponse对象
def process_request(request):    pass
  • 3.处理视图前:在每个请求上调用,返回None或HttpResponse对象
def process_view(request, view_func, view_args, view_kwargs):    pass
  • 4.处理模板响应前:在每个请求上调用,返回实现了render方法的响应对象
def process_template_response(request, response):    pass
  • 5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
def process_response(request, response):    pass
  • 6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
def process_exception(request,exception):    pass
  • 以上描述了六个方法的一次请求响应过程中的阶段