为什么 Django 的 URLField 默认截断为 200 个字符?

2024-05-09

我喜欢 Django 并且经常使用它。我发现它的大部分默认设置都是正常的,但有一个一直困扰着我,以至于我在每个项目中都覆盖了它。

a 的默认最大长度URLField https://github.com/django/django/blob/stable/1.9.x/django/db/models/fields/__init__.py#L2299模型字段有 200 个字符。文档验证了这个限制,但没有解释为什么会这样。

class URLField(CharField):
    ...

    def __init__(self, verbose_name=None, name=None, **kwargs):
        kwargs['max_length'] = kwargs.get('max_length', 200)
        ...

我重写它是因为很多 URL 的长度都超过 200 个字符,尤其是带有查询字符串的 URL。

我知道虽然 HTTP 规范没有指定最大长度 https://stackoverflow.com/questions/266322/is-there-a-limit-to-the-length-of-a-get-request/266345#266345,几乎所有浏览器都支持至少 2000 个字符 https://stackoverflow.com/a/417184/149428,对我来说这表明了一个新的理智的默认值。

好奇地想深入挖掘,我发现了 2007 年 1 月添加限制的第一个提交 (#f6390e8作者:@jacobian);从那以后它基本上没有变化。

https://github.com/django/django/blob/f6390e8983dd364053078cc80361cb369b667690/django/db/models/fields/init.py#L805 https://github.com/django/django/blob/f6390e8983dd364053078cc80361cb369b667690/django/db/models/fields/__init__.py#L805

更进一步,我发现了我认为的 ORM 字段类型到数据库列类型映射代码的版本(#f69cf70作者:@adrianholovaty)。例如,MySQL 文件于 2006 年 5 月存在,自 Django 0.95 以来具有相同的 200 个字符限制:

https://github.com/django/django/blob/f69cf70ed813a8cd7e1f963a14ae39103e8d5265/django/db/backends/mysql/creation.py#L28 https://github.com/django/django/blob/f69cf70ed813a8cd7e1f963a14ae39103e8d5265/django/db/backends/mysql/creation.py#L28


我无法说出为什么选择原始最大长度,您必须询问您找到的补丁的作者。注意MySQL 将唯一 var 字符限制为 255 个字符 https://docs.djangoproject.com/en/dev/ref/databases/#notes-on-specific-fields,因此选择 200 可以避免这个问题。

一旦选择了限制,更改它就会产生向后兼容性问题。由于 Django 1.7 中添加了迁移,因此进行这样的更改会更容易。如果您强烈想要更改它,Django 开发人员邮件列表或票证跟踪器可能是比堆栈溢出更好的询问处。

您可能会发现关于票19515 https://code.djangoproject.com/ticket/19515有趣的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Django 的 URLField 默认截断为 200 个字符? 的相关文章