restful-dj 是一个基于 Django2/3 的 restful 自动路由框架。
此包解决的问题:
Gitee: https://gitee.com/hyjiacan/restful-dj Github: https://github.com/hyjiacan/restful-dj PyPI: https://pypi.org/project/restful-dj/
pip install restful-dj
此组件提供的包(package)名称为 restful_dj
,所有用到的模块都在此包下引入。
在项目的根 urls.py 文件中,使用以下配置
from django.urls import path
import restful_dj
urlpatterns = [
path('any/prefix', restful_dj.urls)
]
其中,any/prefix
是用户自定义的url前缀,可以使用空串 ''
注:可以通过部署地址 any/prefix
访问接口列表 (仅在开发模式时可用)。
配置项需要写到 settings.py 文件中。
RESTFUL_DJ = { 'global_class': ['path.to.CustomClass',], 'routes': { 'path.prefix': 'path.to', }, 'middleware': [ 'path.to.MiddlewareClass' ], 'logger': 'path.to.logger' }
list
,第一个填写一个中间件的完整限定名称test.py
from restful_dj import route from enums import RouteTypes @route('module_name', 'route_name', route_type = RouteTypes.TEST) def test(req): pass
enums.py
from enum import Enum
class RouteTypes(Enum):
TEST = 1
路由文件位置没有要求,只要配置好就可以了。
test/api/demo.py
from django.http import HttpRequest from restful_dj.decorator import route @route(module='module-name', name='name') def get(request, param1, param2=None, param3: int =5): # request 会是 HttpRequest return { 'param1': param1, 'param2': param2, 'param3': param3, } @route(module='module-name', name='name') def get_param(param1, req: HttpRequest, from_=None, param3 =5): # req 会是 HttpRequest return { 'param1': param1, 'from': from_, 'param3': param3, } @route(module='module-name', name='name') def get_param(request: str, param1, from_=None, param3 =5): # request 会是请求参数,参数列表中没有 HttpRequest return { 'request': request, 'param1': param1, 'from': from_, 'param3': param3, } @route(module='module-name', name='name') def get_param(request, param1, from_=None, param3 =5, **kwargs): # 未在函数的参数列表中声明的请求参数,会出现在 kwargs 中 return { 'param1': param1, 'from': from_, 'param3': param3, 'variable_args': kwargs }
一些需要注意的地方:
_
,此时前端请求时,_
符号可省略, 如: from_
在请求时可写作 from=test
(from_=test
亦可)。下划线命名法
与 驼峰命名法
,如:请求参数中的 pageIndex
,在处理函数中可以写作 page_index
或_page_index_
, 也就是说,在前后添加 _
符号都不会影响参数的解析。**kwargs**
),用于接收未在参数列表中列出的请求项。 当然,kwargs
和普通函数一样,可以是任何其它名称。request
参数(与参数位置无关),可能被解析成三种结果(1
和2
均会将其作为 HttpRequest
参数处理):
request
,并且未指定参数类型(或指定类型为 HttpRequest
)HttpRequest
,参数名称可以是任何合法的标识符request
,声明了不是 HttpRequest
的类型,此时会被解析成一般的请求参数再写配置
RESTFUL_DJ = { 'routes': { 'test': 'test.api', } }
此配置表示,所有请求中以 test
开头的地址,都会交由 test.api
下的模块进行处理。
前端调用:
// 请求 get 函数 ajax.get('test.demo?param1=1¶m2=2¶m3=3') // 请求 get_param 函数 ajax.get('test.demo/param?param1=1¶m2=2¶m3=3')
路由可以返回任何类型的数据。路由会自动根据函数定义来判断传入参数的类型是否合法。
比如前面示例中的 param3: int =5
,会根据声明类型 int
去判断传入类型
None
以外的默认值,那么路由会根据默认值的类型自动去判断, 此时可以省略参数类型,如: param3: int =5
省略为 param3=5
route
装饰器 route
用于声明某个函数可以被路由使用。通过添加此装饰器以限制非路由函数被非法访问。
声明为:
def route(module=None, name=None, permission=True, ajax=True, referer=None, **kwargs): pass
module
此路由所属的业务/功能模块名称name
此路由的名称permission
设置此路由是否有权限控制ajax
设置此路由是否仅允许 ajax 访问 保留参数referer
设置此路由允许的 referer 地址 保留参数**kwargs
额外参数这些参数都会被传递给中间件的各个函数的参数
meta
。详细见 RouteMeta
同时,此装饰器会自动尝试将 request.body
处理成 JSON 格式(仅在 content-type=application/json
时),并且添加到 request.B
属性上。
另外,此装饰器会自动将 request.GET
和 request.POST
处理成为可以通过点号直接访问的对象,分别添加到 request.G
和 request.P
上。例:
# 原始数据 request = {...} request.GET = { 'param1': 1, 'param2': 2 } # 此时,只能这样访问 request.GET['param1'] # 而在经过装饰器的处理后,可以这样访问 request.G.param1
但是,一般情况下,使用路由处理函数就能完全操作请求参数的, 所以需要在代码中尽量减少使用 B/P/G
,以避免代码的不明确性。
有的时候,需要在分发前对请求参数进行处理。此时可以使用 restful.set_before_dispatch_handler
来进行一些预处理。
函数签名:
def set_before_dispatch_handler(handler): pass
用法:
import restful_dj def before_dispatch_handler(request, entry, name): # 可以在此处修改 request 的数据 # 也可以重新定义 entry 和 name return entry, name restful_dj.set_before_dispatch_handler(before_dispatch_handler)
路由元数据。
from types import FunctionType from typing import OrderedDict class RouteMeta: @property def handler(self) -> FunctionType: """ 路由处理函数对象 :return: """ return self._handler @property def func_args(self) -> OrderedDict: """ 路由处理函数参数列表 :return: """ return self._func_args @property def id(self) -> str: """ 路由ID,此ID由路由相关信息组合而成 :return: """ return self._id @property def module(self) -> str: """ 装饰器上指定的 module 值 :return: """ return self._module @property def name(self) -> str: """ 装饰器上指定的 name 值 :return: """ return self._name @property def permission(self) -> bool: """ 装饰器上指定的 permission 值 :return: """ return self._permission @property def ajax(self) -> bool: """ 装饰器上指定的 ajax 值 :return: """ return self._ajax @property def referer(self) -> str: """ 装饰器上指定的 referer 值 :return: """ return self._referer @property def kwargs(self) -> dict: """ 装饰器上指定的其它参数 :return: :rtype: Dict """ return self._kwargs
注册到 settings.py 的 RESTFUL_DJ.middleware
列表中。中间件将按顺序执行。
需要注意: 每一个中间件在程序运行期间共享一个实例。
path.to.MiddlewareClass
from django.http import HttpRequest from restful_dj import RouteMeta class MiddlewareClass: """ 路由中间件 """ def process_request(self, request: HttpRequest, meta: RouteMeta, **kwargs): """ 对 request 对象进行预处理。一般用于请求的数据的解码,此时路由组件尚水进行请求数据的解析(B,P,G 尚不可用) :param request: :param meta: :return: 返回 HttpResponse 以终止请求,返回 False 以停止执行后续的中间件(表示访问未授权),返回 None 或不返回任何值继续执行后续中间件 """ pass def process_invoke(self, request: HttpRequest, meta: RouteMeta, **kwargs): """ 在路由函数调用前,对其参数等进行处理,此时路由组件已经完成了请求数据的解析(B,P,G 已可用) 此时可以对解析后的参数进行变更 :param request: :param meta: :return: 返回 HttpResponse 以终止请求,返回 False 以停止执行后续的中间件(表示访问未授权),返回 None 或不返回任何值继续执行后续中间件 """ pass def process_return(self, request: HttpRequest, meta: RouteMeta, **kwargs): """ 在路由函数调用后,对其返回值进行处理 :param request: :param meta: :param kwargs: 始终会有一个 'data' 的项,表示返回的原始数据 :return: 返回 HttpResponse 以终止执行,否则返回新的 return value """ assert 'data' in kwargs return kwargs['data'] def process_response(self, request: HttpRequest, meta: RouteMeta, **kwargs): """ 对 response 数据进行预处理。一般用于响应的数据的编码 :rtype: HttpResponse :param meta: :param request: :param kwargs: 始终会有一个 'response' 的项,表示返回的 HttpResponse :return: 无论何种情况,应该始终返回一个 HttpResponse """ assert 'response' in kwargs return kwargs['response']
from restful_dj import set_logger def my_logger(level: str, message: str, e: Exception): pass set_logger(my_logger)
其中,level
表示日志级别,会有以下值:
路由收集器用于收集项目中的所有路由,通过以下方式调用:
from restful_dj import collector routes = collector.collect()
routes
是一个可以直接迭代的路由数组
在发布产品到线上时,通过此方法将自动产生 Django 的路由配置文件,以提高线上性能。
restful-dj 基于 Django2/3 的 restful 自动路由框架。 此包解决的问题: 告别 Django 繁锁的路由配置 更便捷的 restful 编码体验 自动解析/校验请求参数,填充到路由处理函数 安装 pip installrestful-dj 使用 此组件提供的包(package)名称为 restful_dj,所有用到的模块都在此包下引入。 示例: from restful
(我不得不编辑最明显的链接。) +1为piston - (上面的链接)。我过去曾经使用过apibuilder(华盛顿时报开源),但活塞对我来说更容易。对我来说最困难的事情是弄清楚我的API的URL结构,并帮助使用正则表达式。我也使用了surlex,这使得这件苦差事更容易。 例如,将此模型用于Group(来自我们正在研究的时间表系统): class Group(models.Model): """
一.什么是RESTful? REST与技术无关,代表的是一种软件架构风格(REST是Represent Stare Transfer的简称,中文翻译为“表征状态转移”) REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性 对于REST这
RESTful是一种前后端分离、通过调用API接口来实现具体的功能。 在RESTFUl中,每个URL视为一个资源,客户端通过http动词,对服务器资源进行操作。 关于RESTful的概念和原理更详细的介绍,可以参考下面阮大师的这篇文章,讲的非常透彻。链接地址: http://www.ruanyifeng.com/blog/2011/09/restful.html 我在Django环境中,是通过Dj
HTTP api & RPC & REST & RESTful & GraphQL 摘要 五句话, HTTP API就是以HTTP协议为承载的API。 RPC style API 一般是指以HTTP协议或其他协议来承载的调用远程方法的API。 REST是一种API架构范式,核心围绕着资源,交互的是资源的状态; 特点是响应结果可缓存,服务可发现;目标是API长期使用。 RESTful API是实现了
在开始之前需要下载: pip install djangorestframework 把应用添加进INSTALLED_APPS: INSTALLED_APPS = ( ... 'rest_framework', ) 配置:REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoMode
为什么要写这篇贴? 要写一个最简单的CRUD 符合 Restful Api 规范的 一个Controller, 想百度搜索一下 直接复制拷贝 简单修改一下 方法内代码。 然而, 搜索结果让我无语到家。 没一个是正在符合 Restful Api 规范的实例。 最无语的是 你呀直接 JSP 页面了,还说什么 Restful Api 啊!!! 为方便以后自己复制拷贝使用,我把自己刚
rest全称是 Representational State Transfer,表述性状态转移,资源的表述方式有很多,如xml,json,二进制流(图片,音视频),资源的状态是通过http动词实现(get,post,delete) rest是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是RESTful,不是标准而是风格 满足以下几点的,可以成为restful接口: 1.用URI
http://www.ruanyifeng.com/blog/2011/09/restful.html http://mccxj.github.io/blog/20130530_introduce-to-rest.html http://yuankeqiang.lofter.com/post/8de51_10792a5 RESTful API设计实践 综合上面的解释,我们总结一下什么是RESTfu
自动挂载路由 注意是next版本,我们用的是koa2 $ npm install --save mount-koa-routes@next app.js里修改如下 修改1 var routes = require('./routes/index'); var users = require('./routes/users'); 改为 const mount = require('mount-k
本文向大家介绍详解vue路由篇(动态路由、路由嵌套),包括了详解vue路由篇(动态路由、路由嵌套)的使用技巧和注意事项,需要的朋友参考一下 什么是路由?网络原理中,路由指的是根据上一接口的数据包中的IP地址,查询路由表转发到另一个接口,它决定的是一个端到端的网络路径。 web中,路由的概念也是类似,根据URL来将请求分配到指定的一个'端'。(即根据网址找到能处理这个URL的程序或模块) 使用vue
在Swoole::$php->runMVC() 调用之前可以修改默认的路由函数。 Swoole::$php->router(function(){ return array('controller' => 'YourController', 'view' => 'YourView'); }); Swoole::$php->runMVC(); 设置后将使用制定的函数作为路由,路由函数务必要
phpGrace 追求极致的效率,我们并不认同在url的基础上继续进行复杂的正则匹配是一种高效的、明智的选择!方便的调用规则比不上轻快的效率!所以我们并不建议您使用复杂的路由规则!尽管如此为了满足开发者的需求和习惯我们还是开放了简单路由!在入口页开启路由配置 <?php define('PG_ROUTE', true);//在框架核心文件引用前定义 include 'phpGrace/phpGra
vue怎么自动生成路由?在view目录下新建文件就行了
新建一个vue文件就自动创建向对应文件名的路由
问题内容: 我目前有一个内置路由的AngularJS应用程序。它可以正常工作,并且一切正常。 我的app.js文件如下所示: 我的应用程序内置了CMS,您可以在其中复制 / pages 目录中的新html文件并添加新的html文件。 即使对于新动态添加的文件,我仍然希望通过路由提供程序。 在理想的情况下,路由模式为: $ routeProvider.when(’/ pagename ‘,{temp