博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django REST framework反向生成url
阅读量:7059 次
发布时间:2019-06-28

本文共 2512 字,大约阅读时间需要 8 分钟。

Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢??

在前面的例子中,知道在REST framework中有6种版本控制的方式,进入任意一种版本控制的源码中,

class QueryParameterVersioning(BaseVersioning):    """    GET /something/?version=0.1 HTTP/1.1    Host: example.com    Accept: application/json    """    invalid_version_message = _('Invalid version in query parameter.')    def determine_version(self, request, *args, **kwargs):        version = request.query_params.get(self.version_param, self.default_version)        if not self.is_allowed_version(version):            raise exceptions.NotFound(self.invalid_version_message)        return version    def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):        url = super(QueryParameterVersioning, self).reverse(            viewname, args, kwargs, request, format, **extra        )        if request.version is not None:            return replace_query_param(url, self.version_param, request.version)        return url

可以看到每一个版本控制的类中也都有reverse方法,由此可以了REST framework也是使用reverse的方式来反向生成url

新建一个Django项目,在项目的app中导入rest-framework

settings.py文件中做如下配置

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'app01.apps.App01Config',    'rest_framework',]REST_FRAMEWORK = {    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',    'VERSION_PARAM': "version",    'DEFAULT_VERSION': 'V1',    'ALLOWED_VERSIONS': ['v1', 'v2']}

在urls.py文件中添加路由信息

from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^(?P
\w+)/users/$',views.UsersView.as_view(),name="test1"),]

views.py文件中定义UserView的类

from django.shortcuts import render,HttpResponsefrom rest_framework.views import APIViewfrom rest_framework.versioning import URLPathVersioningclass UsersView(APIView):    def get(self,request,*args,**kwargs):                # 打印版本信息        print("request.version:",request.version)                # reverse方法有一个viewname参数,在这里定义为urls.py中定义的name        print(request.versioning_scheme.reverse("test1",request=request))        return HttpResponse("aaaa")

此时,在浏览器中输入http://127.0.0.1:8000/v1/users/,在服务端后台打印信息如下

request.version: v1http://127.0.0.1:8000/v1/users/

再把浏览器中的url更换为http://127.0.0.1:8000/v2/users/,服务端后台的打印信息又变成了

request.version: v2http://127.0.0.1:8000/v2/users/

可以看到打印出了正确的版本,并且反向生成url也已经成功了

转载地址:http://cegol.baihongyu.com/

你可能感兴趣的文章
Cocos2d-x粒子系统 -- 实现下雪效果
查看>>
[Spring Cloud] 9 Spring Cloud Zookeeper
查看>>
linuxz中的rpc.rstatd 和rpc.statd命令
查看>>
OPPO R15最新广告片发出 预示将有全新交互方式
查看>>
mysql show status 命令中文详解
查看>>
关于Chrome和Firefox
查看>>
在IT界取得成功应该知道的10件事
查看>>
在Linux中让echo命令显示带颜色的字。
查看>>
gitlab安装,使用,备份,恢复
查看>>
xmake v2.1.9版本发布,增加可视化图形菜单配置
查看>>
SQL Server 2016,2014 无法找到数据库引擎启动句柄
查看>>
scp限速传输
查看>>
JVM内存溢出常见原因分析及排查
查看>>
java优化
查看>>
Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群
查看>>
读书十年,不如读懂这百句话
查看>>
Fedora 17安装QQ2012
查看>>
vSphere Client 虚拟机故障排错之从模板克隆或部署后未打开虚拟机电源
查看>>
将多个csv文件合成一个execl文件
查看>>
php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
查看>>