利用Django中间对部分API进行验证

在用Django开发后端接口的时候,有些URL是不需要进行权限验证,有些则需要验证Token。

这里采用中间件来对某些请求进行处理。

1.定义不需要授权的路由

settings.py里面建立一个元组。

1
2
3
4
NOT_AUTH_TOKEN_URLS = (
r'^/admin/',
r'^/api/user/login$'
)

如果不需要授权路由中有巨量多项,那么可以考虑将它写为生成器 ,这样在下面操作迭代的时候可以节省内存。

2.编写自定义中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import re
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings


class AuthTokenMiddleWare(MiddlewareMixin):
def __init__(self, *args, **kwargs):
super(AuthTokenMiddleWare, self).__init__(*args, **kwargs)
self._is_auth = False

def process_request(self, request):
for url_pattern in settings.NOT_AUTH_TOKEN_URLS:
if re.search(re.compile(url_pattern), request.path):
return
break
do_something_with_self_is_auth()


def process_response(self, request, response):
if self._is_auth:
return response
return JsonResponse({
"code": 999,
"data": {
"msg": "Wrong token."
}
})

process_request 是对request的请求的处理,process_response是对响应的处理。

一个请求会依次经过settings.py里面的 MIDDLEWARE 中的中间件,而每个中间件依次经过 process_request(),process_view(),process_exception(非必需),process_template_response(非必需),process_response()。

如果URL满足元组中的正则表达式,那么就不对请求进行Token验证,否则就让_is_ath = True,然后在响应函数中进行判断。

要注意的是静态资源等请求必需走 Web Server 。

参考:Django Middleware

加入中间件

1
2
3
4
MIDDLEWARE = [
....,
'applicationName.middleware.AuthTokenMiddleWare',
]

因为我新建的middleware.py是在应用目录下,所以用上面这样的写法。