Django REST framework反向生成url

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 url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^(?P<version>\w+)/users/$‘,views.UsersView.as_view(),name="test1"),
]

views.py文件中定义UserView的类

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning

class 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: v1
http://127.0.0.1:8000/v1/users/

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

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

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

时间: 2024-10-24 16:09:45

Django REST framework反向生成url的相关文章

Django Rest framework Swagger生成api文档

关于swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: - Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. - Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现. - Swagger 文件可以在许多不同的平台上从代码注释中自动生成. - Swagger 有一个强大的社区,里面有许多强悍的贡献者. 下面就实战django rest swagger为drf生成api接口文档 https://

rbac05 权限角色管理 (modelform/反向生成url/共用删除,编辑页面/共用确认,取消页面)

角色列表添加角色(forms.ModelForm): ###############forms.ModelForm############## 角色列表编辑角色: 编辑和添加角色可以共用一个模板 ====> change.html def role_edit(request,pk): obj = models.Role.objects.filter(pk=pk).first() if not obj: return HttpResponse("角色不存在") if request

Django Rest framework序列化流程

目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是序列化 序列化模型与序列化关系模型 序列化模型,顾名思义,即对 models 里的数据模型作序列化. 而序列化关系模型则是对 models 里数据模型中带有关系的如 ForeignKey, ManyToManyField 和 OneToOneField 字段作序列化. Django Rest Fra

数据库表反向生成(二)django ORM inspectdb

在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model.py的表. 反向生成,指的是先在数据库中create table,然后通过django内置的编译器,生成model代码. 1.准备工作 创建django工程以及

Django 反向生成 从数据库生成Model

Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > models.py 就可以生成了自动产生Django model

从数据库反向生成django的models

有办法实现django 数据库反向生成models的方法吗?答案是肯定的. 1. 配置 settings.py 中的数据库配置部分 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydb', 'USER': 'root', 'PASSWORD': 'password', 'HOST': '127.0.0.1', 'PORT': '3306', } } 2.运行命令 python mysite/m

数据库和Django model 生成和反向生成

Django 脚本生成数据表 建立映射关系 如果询问时区时间,选1 然后输入timezone.now() python manage.py makemigrations (如果有子应用的话子应用名称填在后) 建立数据表 python manage.py migrate 子应用名称 如果建立表后,修改某些字段需要重新建表,需要将django_migrate表中的对应数据清空后,再执行 python manage.py migrate 子应用名称 反向生成model类 python manage.p

Python - Django - 命名 URL 和反向解析 URL

命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试页面</title> </head> <body> <p>测试页面</p> <form action="/test/" method=&quo

从数据库反向生成django项目中的models文件

1.创建一个django项目 2.在项目配置文件settings.py中配置好数据库的相关配置 3.确保所关联的数据库中已经有表存在 4.在pycharm终端进入到项目的根目录,执行python manage.py inspectdb,查看可以导入到models的相关信息 5.执行python manage.py inspectdb > (需要导入表的app)/models.py,即可完成反向生成models文件 6.进入models文件进行相关修改 原文地址:https://www.cnblo