kos*_*tik 7 django django-testing django-rest-framework
我们使用Django构建web-app后端,为Ember应用程序提供RESTful API.
所以(进化上)我们从以下简单结构开始:
project root
|
|-app1 / models.py .... no views.py
|
|-app2 / models.py .... no views.py
|
|-app3 / models.py .... no views.py
|
\- restapi - provides REST API for app*: huge views.py, huge serializers.py, huge test.py
Run Code Online (Sandbox Code Playgroud)
这很容易使用,特别是DRF的可浏览视图:
@api_view(['GET'])
def api_root(request, format=None):
return Response(
{
'users': reverse('current-user-detail', request=request),
'interfacesettings': reverse('interface-settings', request=request),
............................................................
'preferences': reverse('preferences', request=request),
}
)
Run Code Online (Sandbox Code Playgroud)
很快我们就有了足够的模型/ API来使我们的restapi.app方式过于复杂和混乱,我们开始考虑使用更合乎逻辑的东西:
project root
|
|-app1 / models.py .... views.py, serializers.py, tests.py
|
|-app2 / models.py .... views.py, serializers.py, tests.py
|
|-app3 / models.py .... views.py, serializers.py, tests.py
|
\- we do not need rest api anymore (but where will we put our api_root?)
Run Code Online (Sandbox Code Playgroud)
另一方面,我们现在在一个方便的地方进行了所有复杂的测试(包括很少的模型).我们重复使用序列化程序的功能.我们有一个api_root.所以我们可能会有这样的事情:
project root
|
|-app1 / models.py .... views.py (app1 API), serializers.py, tests.py
|
|-app2 / models.py .... views.py (app2 API), serializers.py, tests.py
|
|-app3 / models.py .... views.py (app3 API), serializers.py, tests.py
|
\- restapi - views.py (api_root), tests.py for complicated tests and serializers.py for common functions
Run Code Online (Sandbox Code Playgroud)
哪种方法更好?这里有哪些常见的最佳实践?我们可以看看有没有开放的项目?
Jav*_*ira 10
我正在和你一样使用Django构建一个安静的API.我正在做的是拥有像你上一个例子一样独立的应用程序.
我们有一个"核心"django应用程序,我们在视图中有api_root和一个名为"apis_urls.py"的文件,我们组织来自不同应用程序的所有URL.
我们在这个"核心"应用程序中还有一个文件"apis_filters.py",其中我们有任何带有API的应用程序可以使用的过滤器和"apis_permissions.py"来管理使用apis和导入其他应用程序的权限.
所以最后我们这样工作:
project root
|
|-app1 / models.py .... views.py (app1 API), serializers.py, tests.py
|
|-app2 / models.py .... views.py (app2 API), serializers.py, tests.py
|
|-app3 / models.py .... views.py (app3 API), serializers.py, tests.py
|
\- core / views.py (api_root), apis_urls.py, apis_filters.py, apis_permissions.py
Run Code Online (Sandbox Code Playgroud)
我们在相应的应用程序中进行所有测试.
拥有apis_urls.py允许我们拥有所有API网址,例如:
http://localhost/api/v1/example1
http://localhost/api/v1/example2
Run Code Online (Sandbox Code Playgroud)
在主urls.py中我们有:
url(r'^api/v1/', include('core.apis_urls', namespace='api')),
Run Code Online (Sandbox Code Playgroud)
在核心应用程序上,在"apis_urls.py"上:
urlpatterns = patterns(
'',
####### Users Urls
url(r'^users/$', users_views.UserListAPIView.as_view(), name='users-list-api'),
url(r'^me/$', users_views.LoggedUserRetrieveUpdateAPIView.as_view(), name='logged-user-detail-api'),
url(r'^users/(?P<username>[\w.@+-]+)/$', users_views.UserRetrieveAPIView.as_view(), name='users-detail-api'),
####### Comments Urls
url(r'^comments/(?P<pk>[0-9]+)$', comments_api_views.CommentCreateAPIView.as_view(), name='comments-create-api'),
)
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助,就是我发现它更有组织的方式.
| 归档时间: |
|
| 查看次数: |
2604 次 |
| 最近记录: |