python-为什么在此类中采用这种方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-为什么在此类中采用这种方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2675字,纯文字阅读大概需要4分钟。
内容图文
![python-为什么在此类中采用这种方法?](/upload/InfoBanner/zyjiaocheng/673/9823f833faf741c9b3cfee7432979f28.jpg)
在通用视图内部的基类中,django在运行时创建一个方法视图,将其附加到通用视图类,然后在该类上调用dispatch方法
我不了解这种方法的目的,为什么不直接从as_view方法中调用dispatch方法?
class View(object):
"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
"""
http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
def __init__(self, **kwargs):
"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
for key, value in kwargs.iteritems():
setattr(self, key, value)
@classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
# sanitize keyword arguments
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError(u"You tried to pass in the %s method name as a "
u"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError(u"%s() received an invalid keyword %r" % (
cls.__name__, key))
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
self.request = request
self.args = args
self.kwargs = kwargs
return handler(request, *args, **kwargs)
def http_method_not_allowed(self, request, *args, **kwargs):
allowed_methods = [m for m in self.http_method_names if hasattr(self, m)]
logger.warning('Method Not Allowed (%s): %s' % (request.method, request.path),
extra={
'status_code': 405,
'request': self.request
}
)
return http.HttpResponseNotAllowed(allowed_methods)
解决方法:
在基于类的通用视图中,任何请求都应具有自己的MyView类实例.
这是我们的urls.py:
from foo.views import AboutView
....
(r'^about/', AboutView.as_view()),
每个django线程一次导入urls.py.这意味着调用as_view不会创建AboutView的实例.
当请求由urlconf处理时,将调用view()方法,然后才创建AboutView实例,并使用此特定请求所需的所有相关数据传递并填充该实例.
使用:
(r'^about/', AboutView().dispatch), #WRONG!!!!
将导致所有请求共享该视图的同一实例,包括不应由不同请求重用的可能的属性.
内容总结
以上是互联网集市为您收集整理的python-为什么在此类中采用这种方法?全部内容,希望文章能够帮你解决python-为什么在此类中采用这种方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。