Django 自动路由的简易实现

本文介绍了一种Django框架下的自动路由实现方案,该方案通过一次性配置实现后续请求自动路由,无需为每个请求单独配置。文章提供了实现原理及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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(可以为空)。

  1. 利用__import__加载模块,如果加载不成功,则返回404
  2. 读取请求的method,再检查是否传入了name,构建处理函数的完整名称
  3. 利用hasattr在加载的模块中查找是否存在对应的函数,如果找不到,则返回 404
  4. 利用inspect.getfullargspec读取函数的参数声明
  5. 调用处理函数,将request作为参数传过去
  6. 分发完成

用法

设有以下文档结构

|--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');

转载于:https://my.oschina.net/hyjiacan/blog/3028740

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值