【问题标题】:django urlpatterns from sql来自 sql 的 django urlpatterns
【发布时间】:2011-03-23 12:13:49
【问题描述】:

我正在尝试使用 sql 查询创建 urlpatterns,但这仅适用于服务器启动时已经存在于 sql 表中的那些内容。是否可以让 django 从数据库中动态检查新的 url?

我知道,这可以用正则表达式来完成,但是它们太贪心了,我的意思是,我需要在我的站点的根级别进行此操作,并且正则表达式将“吃掉”所有匹配的名称,并且此正则表达式必须是urlpatterns 列表的最后一个。

【问题讨论】:

    标签: django url-pattern


    【解决方案1】:

    继续对 pyeleven 的回答发表评论,看来您已经理解了 urlpatterns 的意义。您不需要或不想在 urlconf 中指定您的部分的选择。您所做的是获取 url 每个部分的 value,并将其作为参数传递给视图。所以,例如:

    (r'^?P<section>\w+)/$', 'my_view')
    

    这将获取/name1//name2/ 之类的网址,并将name1name2 作为section 参数传递给视图。因此,无论何时添加部分,都无需更改代码。

    【讨论】:

    • 不,这不是我想要实现的。这只会发送到“my_view”命名组,如 section="name1"。我想避免 urlpatterns 中的正则表达式(或者可能会限制正则表达式的范围,但我不想将其更深一层,例如“domain.com/major/name1”)
    • 这看起来确实是正确的方法。如果您担心这个正则表达式会“吃掉”所有内容,只需将其放在所有其他网址下方,以便它们首先匹配。然后,如果该部分不在数据库中,只需从您的视图中提出 404。
    • 这种方法的一个缺点是,除非您使用某种前缀限定这些 URL,否则该规则将始终成功。我发现的一个后果是 APPEND_SLASH 变量不会产生任何影响,因为它只会在 URL 匹配失败后才起作用。任何人都知道解决这个问题的方法吗?或者有什么其他的缺点?
    【解决方案2】:

    虽然这是可以想象到的最讨厌、最不像 django 的东西,但如果你真的、真的想要的话,你可以从 db 中获取你的 url:

    models.py

    from django.db import models
    
    class Url(models.Model):
        name = models.CharField(max_length=20)
    

    urls.py

    from my_app.models import Url
    
    urls = []
    for url_object in Url.objects.all():
        urls.append(url(url_object.name, 'my_view'))
    
    urlpatterns = patterns('my_app.views', *urls)
    

    瞧。它确实有效。直接来自数据库的 URL 模式。请不要这样做。

    我现在要去洗澡了。

    【讨论】:

    • 一个警告 - 我相信每次在数据库中有一个新的 url 时你都必须重新启动你的进程,因为我相信 urls.py 只在启动时解析一次。这确实不是一个好主意。
    • 好的,谢谢。你能告诉我,为什么从 db 获取 url 是个坏主意吗?
    • 好吧,就像我说的那样——我认为这段代码只会在启动时解析一次,所以如果你向数据库添加一个 url,它在你重新启动 django 进程之前不会生效。做丹尼尔建议的事情可以完成完全相同同样的事情,但使用 django 的设计方式。
    • 好的,谢谢您的回复!在我看来,丹尼尔的方式是最好的。
    【解决方案3】:

    你检查过 django flatpages 吗?

    http://docs.djangoproject.com/en/dev/ref/contrib/flatpages/?from=olddocs

    动态 url 可能不是一个好主意,例如动态添加的错误 url 行可能会导致服务器停止运行。

    你能详细说明你的目标吗?

    【讨论】:

    • 我想把网站分成几大类,如果你从一开始就知道你会使用什么分类——没问题,但如果你不知道你需要想办法添加他们,我认为每次添加主要类别时编辑站点的源代码是个坏主意。因此,我正在尝试从 sql 数据库中获取主要类别:它将允许通过管理界面轻松添加它们(甚至删除)我想要获取 url,例如 urlpatterns = patterns('', (^name1/$, major_page), (^name2/$, major_page), ) 是的,它们应该指向我将处理它们的相同视图
    猜你喜欢
    • 2021-07-27
    • 2012-04-13
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2013-07-16
    • 2012-01-06
    相关资源
    最近更新 更多