2014-11-05 58 views
5

我正在尝试为REST应用程序创建版本。这里是我的网址ExamleDjango REST框架:如何在URL中添加版本前缀

www.myapi.com/foo [default version] 
www.myapi.com/v1/foo [version one] 

这是项目结构

├── __init__.py 
├── settings.py 
├── urls.py 
├── default_app 
│ ├── __init__.py 
│ ├── serializer.py 
│ ├── models.py 
│ ├── views.py 
│ ├── urls.py 
│ 
└── v1_app 
├── __init__.py 
├── serializer.py 
├── models.py 
├── views.py 
├── urls.py 

default_app urls.py

from django.conf.urls import * 
from default_app import views as df_views 
from rest_framework import routers 

router = routers.DefaultRouter() 
router.register(r'foo', df_views.viewname, "foo") 
urlpatterns = router.urls 

v1_app urls.py

from django.conf.urls import * 
from v1_app import views as ver_views 
from rest_framework import routers 

router = routers.DefaultRouter() 
router.register(r'foo', ver_views.viewname, "foo") 
urlpatterns = router.urls 

为urls.py主文件

from django.conf.urls import patterns, include, url 
from defualt_app import urls as default_urls 
from v1_app import urls as v1_urls 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 



urlpatterns += patterns('', 
    url(r'^', include(default_urls, namespace="default")), 
    url(r'^v1/', include(v1_urls, namespace="v1")) 
) 

urlpatterns += staticfiles_urlpatterns() 

我的问题是,在使用简单的URL没有任何前缀,那么它的工作

www.myapi.com/foo我

当我使用版本前缀v1或v2时,它会抛出错误[页面编号t上找不到(404)]

www.myapi.com/v1/foo

我有这个想法从这个链接 https://stackoverflow.com/a/21839842/1558544

如果我不使用中间件类则是这可能会得到相同的结果?

谢谢

+0

如果您在'^'的前面放置更明确的'^ v1'模式,会发生什么情况 – 2014-11-05 13:20:37

+0

然后两者都不会工作。找不到页面(404)错误 – 2014-11-05 13:34:44

回答

0

Django的REST框架不支持URL命名空间以及,但也有让他们在大多数情况下工作的解决方案。

在串行的情况下,你必须定义超链接与HyperlinkedRelatedField所有领域,包括url场自动添加,这是一个HyperlinkedIdentityField。这包括将所有字段的view_name参数设置为正确的,自动生成的视图名称。这应该是像[namespace]:[base_name]-detail

但是,这也意味着您不能使用由DefaultRouter产生的DefaultRouter索引页,因为它不会在所有处理命名空间。为了获得一个,你需要创建你自己的,或者覆盖路由器中自动生成的视图。