2014-11-05 16 views
5

Tôi đang cố gắng tạo phiên bản cho ứng dụng REST. Đây là URL của tôi examleKhung làm việc REST Django: Cách thêm tiền tố vào URL để phiên bản

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

Đây là cấu trúc dự án

├── __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 

tập tin chính cho 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() 

Vấn đề của tôi là, khi tôi sử dụng url đơn giản mà không cần bất kỳ tiền tố sau đó nó đang làm việc

www.myapi.com/foo

và khi tôi sử dụng tiền tố phiên bản v1 hoặc v2 thì nó sẽ phát ra lỗi [Trang không t tìm thấy (404)]

www.myapi.com/v1/foo

Tôi có ý tưởng này từ liên kết này https://stackoverflow.com/a/21839842/1558544

Nếu tôi không sử dụng lớp trung gian sau đó là điều này có thể để có được kết quả tương tự?

Cảm ơn bạn

+0

điều gì sẽ xảy ra nếu bạn đặt mẫu văn bản '^ v1' rõ ràng hơn trước '^' –

+0

Sau đó cả hai sẽ không hoạt động. Lỗi không tìm thấy trang (404) –

Trả lời

0

Django REST của Framework không hỗ trợ url namespace cũng, nhưng có những giải pháp để làm cho họ làm việc cho hầu hết các trường hợp.

Trong trường hợp bộ nối tiếp, bạn phải xác định tất cả các trường được siêu liên kết với HyperlinkedRelatedField, bao gồm trường url được thêm tự động, là HyperlinkedIdentityField. Điều này bao gồm việc đặt đối số view_name trên tất cả các trường thành tên chế độ xem được tạo tự động chính xác. Đây phải là một cái gì đó như [namespace]:[base_name]-detail.

Nhưng điều này cũng có nghĩa là bạn không thể sử dụng trang chỉ mục DefaultRouter được tạo bởi DefaultRouter, vì nó không xử lý không gian tên nào cả. Để có được một, bạn sẽ cần phải tạo riêng của bạn, hoặc ghi đè lên chế độ xem được tạo tự động trong bộ định tuyến.

Các vấn đề liên quan