只需使用django构建一个强大的JSONRESTAPI

djsonREST的Python项目详细描述


djsonREST公司

djsonREST提供了简单而强大的特性,可以在几分钟内实现您自己的REST-API(数据编码为json)。在

默认情况下,将对路由进行版本控制。在

它还包括一个插件,用于使用JWTs使用消费者和用户进行身份验证。在

rest路由url的基本结构: your_path/+VersionMajor.Minor+/endpoint_url

安装

使用python包管理器pip安装djsonrest。在

pip install djsonrest

依赖关系

djutils

使用

添加到您的django项目

djsonrest添加到您的INSTALLED_APPS。在

^{pr2}$

如果要覆盖djsonrest提供的默认路由,请在订购project应用之前订购此应用程序。在

djsonrest.middleware.RESTRoutesMiddleware添加到您的MIDDLEWARE。在

MIDDLEWARE=[...'djsonrest.middleware.RESTRoutesMiddleware',]

如果要自定义rest路由的异常处理,请重写RESTRoutesMiddleware类和 而是配置自己的中间件类。在

将api终结点的路径添加到网址.py的urlpatterns。在

fromdjsonrestimportresturlpatterns=[...path('api/',rest.routes.urls),]

定义路线

使用route decorator @rest.route(...)定义自己的rest路由。 所有rest路由都必须在应用程序/项目中名为rest_routes的模块中定义。 此模块将在django初始化时自动加载,因此正在注册路由。在

fromdjsonrestimportrestclassUsers(rest.RESTRouteGroup):@rest.route('/users',version=1.0,method='GET')defusers_get(self,request):return[...]# Return any json-encodable object

使用定义为类方法的路由,可以在继承的类中重写它们。这样您就可以提供可扩展的路线。 若要重写现有路由,请保持路由装饰器不变。如果要添加第二条管线,请更改管线装饰器。在

classMyUsers(Users):@rest.route('/users',version=1.0,method='GET')defusers_get(self,request):result=super().users_get(request)result.append([...])returnresultclassMyUsersV2(Users):@rest.route('/users',version=2.0,method='GET')defusers_get(self,request):result=super().users_get(request)return{"users":result}

具有身份验证的路由

route decorator提供一个auth参数,auth类(djsonrest.auth.Authentication的子类)可以传递给它。 在主处理请求之前,将使用给定的auth类对请求进行身份验证。在

已给定以下身份验证类:

  • djsonrest.auth.Public(默认) 公共路由,不进行身份验证
  • djsonrest.addons.jwt_auth.auth.AbstractJWTAuth(JWT身份验证的抽象基类) 在AuthenticationHTTP报头中需要一个类型为Bearer的JWT令牌
  • djsonrest.addons.jwt_auth.auth.Consumer(jwt\u auth插件,扩展djsonrest.addons.jwt_auth.auth.AbstractJWTAuth) 需要一个JWT令牌,其受众为consumer。请求用户将是在使用者记录中定义的用户
  • djsonrest.addons.jwt_auth.auth.User(jwt\u auth插件,扩展djsonrest.addons.jwt_auth.auth.AbstractJWTAuthUserStrong和{}身份验证的基。期望JWT令牌具有访问群体user_strong或{} 具有访问群体user_strong的令牌仅在1小时内有效(默认情况下,可以在您的设置中保存),因此 可以将这些令牌用于高风险终结点,这些端点应仅在初始身份验证后的短时间内可用 针对api 具有访问群体user_weak的令牌有效期为30天(默认值,可以在您的设置中更改),因此这些令牌 可用于用户与api的一般交互
  • djsonrest.addons.jwt_auth.auth.UserStrong(jwt\u auth插件,扩展djsonrest.addons.jwt_auth.auth.AbstractJWTAuth) 与User身份验证类似,但只接受访问群体user_strong的令牌
  • djsonrest.addons.jwt_auth.auth.UserWeak(jwt_auth插件,扩展djsonrest.addons.jwt_auth.auth.AbstractJWTAuth) 与User身份验证类似,但只接受访问群体user_weak的令牌
fromdjsonrestimportrestfromdjsonrest.addons.jwt_authimportauthclassUsers(rest.RESTRouteGroup):@rest.route('/users',version=1.0,method='GET',auth=auth.UserWeak)defusers_get(self,request):return[...]@rest.route('/users/<int:id>',version=1.0,method='PATCH',auth=auth.UserStrong)defuser_edit(self,request,id):# high risk action, protected by a short life token...

多种身份验证方法

如果应该有多个身份验证方法可用,那么可以使用|-运算符将它们组合到HybridAuth。 使用HybridAuth|-运算符,所有组合的身份验证方法都会相互尝试。 这样,就可以为单个路由定义多个可用方法。在

fromdjsonrestimportrest,authfromdjsonrest.addons.jwt_authimportauthasjwt_authclassUsers(rest.RESTRouteGroup):@rest.route('/users',version=1.0,method='GET',auth=jwt_auth.UserWeak|auth.Public)defusers_get(self,request):return[...]

配置JWT签名

要使用jwt_auth插件,必须设置一些设置并创建文件。在

创建私钥和公钥文件:

openssl ecparam -genkey -name secp521r1 -noout -out private.pem
openssl ec -in private.pem -pubout -out public.pem

settings.py中设置这些文件的路径:

JWT_PRIVATE_KEY_FILE=os.path.join(BASE_DIR,'keys','private.pem')JWT_PUBLIC_KEY_FILE=os.path.join(BASE_DIR,'keys','public.pem')

移除现有路由

这将用于其他应用程序注册的不需要的路由

建议在rest_routes模块的__init__.py中实现(如果只是一个文件,则在开头实现)。 它是可以删除具有给定的path(始终是必需的)的所有路由,或者通过添加要删除的路由的版本和方法对其进行筛选。在

fromdjsonrestimportrestrest.remove('/unwanted/anything')rest.remove('/unwanted/route_at_version',version=1.0)rest.remove('/unwanted/method_route_at_version',version=1.0,method='GET')

许可证

GNU GPLv3,请参阅许可证

维护者

此包由Manuel Stingl维护。 有关详细信息,请参见https://opensource.voltane.eu

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我可以使用Hibernate连接不同的数据库并从表中导入数据吗?没有预定义的对象类   java为什么getBoundsInLocal获取错误的坐标?   java在处理并发哈希映射时必须使用锁   java将过滤的JTable数据导出到文本文件   从命令行编译java不使用库   Java使用方法和构造函数绘制图形   java理解优先级队列中的排序方法   尝试解密文件时,java CipherInputStream为空   在Java中将字符串解析为长字符串   java我想在raspberry pi重新启动时在crontabe中执行arecord命令   弹性搜索弹性搜索Lucene公式的Java计算   java使用apachepoi和docx4j读取doc文件   swing显示JavaGUI是否需要特殊处理?   java使用字符串进行数学运算   java在SpringMVC中用JSP初始化菜单项选择表单数据的最佳方法   无多线程的java多客户端程序   swing如何在Java中对BuffereImage进行去饱和?   java在安卓中创建自定义地图