前言
用Django
一年多了,很不喜欢它的路由配置,很个请求都要去配置一下,简直不能再麻烦了。于是,就找啊找,想找到一个配置一次,只需要写代码就能做的自动路由,一直没找到。好吧,自己来干一个吧。
路由的实现与使用代码在 https://gitee.com/hyjiacan/codes/thl0qync4r6vesapk3dui17
设计
- 路由请求的处理,使用模块下的函数直接处理,不需要写类
- 处理函数可以没有参数,或者是只有一个参数
request
- 在一个模块下,可以处理不同类型的请求
method
,如:GET
,POST
,DELETE
,PUT
等 - 处理函数可以是默认处理(
def get(request):
)或具名处理(def get_xxx(request):
)
实现
利用Django
路由参数可选的特性,接收所有的请求,然后交给指定的函数dispatcher
(后称分发器)去处理分发。
分发器的签名如下:
def dispatcher(req, entry, name=''):
pass
分发器在拿到请求时,会得到一个模块名entry
与具名处理函数名name
(可以为空)。
- 利用
__import__
加载模块,如果加载不成功,则返回404
- 读取请求的
method
,再检查是否传入了name
,构建处理函数的完整名称 - 利用
hasattr
在加载的模块中查找是否存在对应的函数,如果找不到,则返回404
- 利用
inspect.getfullargspec
读取函数的参数声明 - 调用处理函数,将
request
作为参数传过去 - 分发完成
用法
设有以下文档结构
|--main
|--__init__.py
|--settings.py
|--router.py
|--urls.py
|--views.py
|--wsgi.py
|--api
|--__init__.py
|--test
|--__init__.py
|--demo.py
demo.py 文件如下:
def get(request):
return HttpResponse(200)
def post(request):
return HttpResponse(200)
def delete(request):
return HttpResponse(200)
def put(request):
return HttpResponse(200)
def get_xxx(request):
return HttpResponse(200)
def post_xxx(request):
return HttpResponse(200)
def delete_xxx(request):
return HttpResponse(200)
def put_xxx(request):
return HttpResponse(200)
那么,在前台就可以直接通过以下方式去访问这些函数:
axios.get('api.test.demo');
axios.post('api.test.demo');
axios.delete('api.test.demo');
axios.put('api.test.demo');
axios.get('api.test.demo/xxx');
axios.post('api.test.demo/xxx');
axios.delete('api.test.demo/xxx');
axios.put('api.test.demo/xxx');