pal*_*sey 5 django asp.net-mvc http-verbs django-views
在ASP.NET MVC中,您可以使用AcceptVerbs属性将视图函数与动词相关联:
public ActionResult Create()
{
// do get stuff
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
// do post stuff
}
Run Code Online (Sandbox Code Playgroud)
Django Book建议如下:
def method_splitter(request, *args, **kwargs):
get_view = kwargs.pop('GET', None)
post_view = kwargs.pop('POST', None)
if request.method == 'GET' and get_view is not None:
return get_view(request, *args, **kwargs)
elif request.method == 'POST' and post_view is not None:
return post_view(request, *args, **kwargs)
raise Http404
Run Code Online (Sandbox Code Playgroud)
urls.py:
urlpatterns = patterns('',
# ...
(r'^somepage/$', views.method_splitter, {'GET': views.some_page_get,
'POST': views.some_page_post}),
# ...
)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点难看 - 是否有一个装饰器可以将HTTP动词与视图,ASP.NET MVC风格或其他可接受的方式相关联?
zgo*_*oda 11
有标准的内置装饰器需要特定的HTTP方法或允许的方法列表.
请参阅代码:http://code.djangoproject.com/browser/django/trunk/django/views/decorators/http.py.
2016年更新的答案:现代Django具有内置所需的一切,并可通过基于类的视图获得.在最原始的形式中,规范方法是子类化django.views.generic.View并实现以HTTP谓词命名的类方法:
class MyView(View):
def get(self, request, *args, **kwargs):
# ...
def post(self, request, *args, **kwargs):
# ...
Run Code Online (Sandbox Code Playgroud)
在内部,它的工作方式与我下面的古代代码(在Django具有基于类的视图之前编写)非常类似.有一种View.dispatch方法基本上可以查找要调用的内容,或者如果找不到任何内容则返回405 : getattr(self, request.method.lower(), self.http_method_not_allowed).
当然,如果您进行表单处理,模板渲染或常见的CRUD内容,请务必查看可用的View子类.
从2009年下面的遗留答案.该代码仍然适用于2016年,但不是DRY解决方案,因此请勿使用它.2011年,Django获得了基于阶级的观点,而现在它们是应该如何完成任务的标准方法.我保留这里只是出于历史目的.旧答案文本如下:
在一个特定的视图中,我需要为不同的HTTP方法(这是我的小型WebDAV实现)提供单独的代码,我正在做这样的事情:
class SomeView(object):
def method_get(self, request, ...):
...
def __call__(self, request, *args, **kwargs):
m = getattr(self, 'method_%s' % request.method.lower(), None)
if m is not None:
return m(request, user, *args, **kwargs)
return HttpResponseNotAllowed("405 Method Not Allowed")
# Then url(r'...', SomeView()),
Run Code Online (Sandbox Code Playgroud)
添加/编辑:嗯,我想了一下,实际上实现了装饰器方法.它没有我最初想的那么糟糕.
def method_not_allowed_view(request, *args, **kwargs):
return HttpResponseNotAllowed("405 Method Not Allowed")
def http_method(*methods):
methods = map(lambda m: m.lower(), methods)
def __method_wrapper(f):
this_module = __import__(__name__)
chain = getattr(this_module, f.__name__, method_not_allowed_view)
base_view_func = lambda request, *args, **kwargs: \
f(request, *args, **kwargs) if request.method.lower() in methods \
else chain(request, *args, **kwargs)
setattr(this_module, f.__name__, base_view_func)
return base_view_func
return __method_wrapper
@http_method('get')
def my_view(request):
return HttpResponse("Thank you for GETting.")
@http_method('post', 'put')
def my_view(request):
return HttpResponse("Thank you for POSTing or PUTting.")
# url(r'...', 'app.my_view'),
Run Code Online (Sandbox Code Playgroud)
无论如何,这篇文章是一个社区维基,所以如果你喜欢这个想法,请随时改进!修订历史还包含了一些我在编写之前尝试过的不同方法......
您可以使用视图装饰器
来自文档:
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2311 次 |
| 最近记录: |