django的RegexURLPattern __init__如何工作

时间:2017-11-13 16:17:22

标签: django

我试图了解django框架的内部工作原理。具体来说,URL请求和视图的功能。我一直在理解RegexURLPattern类中的 init 方法是如何工作的。我是Python和django的初学者,我不确定将这种行为称为谷歌。我正在使用pycharm调试器来逐步执行代码,因为django服务器正在启动并初始化它。从我理解的初始化过程如下。

步骤1:要开始初始化URL模式的过程,首先初始化as_view类方法,它返回视图函数

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        PasswordResetConfirmView.as_view(
            template_name='passreset/pmp_password_reset_confirm.html',
        ), name='password_reset_confirm')

步骤2:在django.conf.urls init 中,此函数接收url,regex,对步骤1中视图函数的引用以及可能的其他参数

def url(regex, view, kwargs=None, name=None):
    if isinstance(view, (list, tuple)):
        # For include(...) processing.
        urlconf_module, app_name, namespace = view
        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
    elif callable(view):
        return RegexURLPattern(regex, view, kwargs, name)
    else:
        raise TypeError('view must be a callable or a list/tuple in the case of include().')

步骤3在上面的elif块中,实例化RegexURLPattern对象。在调试器上点击F7并在实例化时潜入对象会让我进入这个初始化块

class RegexURLPattern(LocaleRegexProvider):
    def __init__(self, regex, callback, default_args=None, name=None):
        LocaleRegexProvider.__init__(self, regex)
        self.callback = callback  # the view
        self.default_args = default_args or {}
        self.name = name

步骤4和问题1:在调试器中扩展self的属性我没有看到“回调”属性,也没有找到LocaleRegexProvider mixin中的属性。实际上default_args和name也不是prsent。仅存在“lookup_str”和“regex”字符串属性。它从何而来?这个电话是否创造了它?

self = {RegexURLPattern} Unable to get repr for <class ...
 lookup_str = {str} 'Traceback (most recent call last):\n  File 
 regex = {str} 'Traceback (most recent call last):\n  File 

步骤5当我逐步执行init块并执行self.callback时,使用相关视图类的字符串名称神奇地更新lookup_str属性,并将新的正则表达式对象添加到Self

lookup_str = {str} 'django.contrib.auth.views.PasswordResetConfirmView'
regex = {SRE_Pattern} re.compile('^reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?

步骤6和问题2:self.callback = callback如何使步骤5中描述的更改成为可能?

1 个答案:

答案 0 :(得分:1)

Python中的所有对象都是动态的。这里没有关于URL模式类的具体内容。当你在__init__方法的开头枚举类的属性时,你没有看到回调属性的原因是它还没有被定义:你可以看到,该定义发生在方法的最后。如果您逐步完成并再次枚举属性,您将看到该属性。

lookup_str首先因异常而失败的原因是它是property而不是属性;基础方法依赖于self.callback的存在,__init__的存在直到presto:default> select count(*) from patrequests; _col0 ------- 0 (1 row) Query 20171113_163811_00033_vdw6c, FINISHED, 1 node Splits: 17 total, 17 done (100.00%) 0:00 [0 rows, 0B] [0 rows/s, 0B/s] 结束时才会存在。