在 Django Url Dispatcher 中获取 http 请求数据?这可能吗?如果是这样,怎么做?

Posted

技术标签:

【中文标题】在 Django Url Dispatcher 中获取 http 请求数据?这可能吗?如果是这样,怎么做?【英文标题】:Get http request data in Django Url Dispatcher? Is this possible? If so, how? 【发布时间】:2014-01-09 13:09:44 【问题描述】:

我想根据 http 请求的内容有条件地在我的 django 应用程序中路由 url,类似于:

if request.user.is_authenticated() and request.user.is_staff():
       #provide a specific set of urls
elif request.user.is_authenticated():
       #provide alternative urls
else
       #provide default urls

我想在我的应用程序的 url 调度程序中执行此操作,因为如果用户未登录,我希望某些 url 对用户完全不可用。我觉得这样做比指向更干净视图以确定渲染的内容。有没有人这样做过?这在 Django 中甚至可能吗?谢谢

【问题讨论】:

为什么不用url来装饰views呢? 【参考方案1】:

这是不可能的。每次请求进入时都不会读取 urls 文件。当您在处理请求之前启动 django 实例时,它会运行。

user995394 提出的建议将是我的处理方式。

如果您确实想这样做,请深入挖掘。你可以指定一个请求中间件。

class FooMiddleware(object):
    def process_request(self, request):
        if request.user.is_authenticated():
            request.urlconf = 'myproject.authed_urls2'

我在一个 django 项目中测试了上述中间件。当我登录时,会针对该请求处理备用文件,而在另一个窗口中,未经身份验证的用户仍在使用原始 url conf。

不过,我还是建议您在视图上使用装饰器。如果您担心人们会发现只有员工才应该知道的网址,您可以让您需要身份验证的装饰器回复 NotFound 而不是 NotAuthorized

【讨论】:

是的,但是您可以拥有多个 urls.py 并切换您将哪个用于给定请求(但这相当复杂 - 恕我直言无用 - 黑客攻击)。【参考方案2】:

这可以通过自定义中间件(在process_request 部分)或猴子patching core.handlers.BaseHandler.get_response() 实现,但真正使用装饰器(也可以在您的 urls.py 文件中完成)是明智的选择.

【讨论】:

我一直在研究自定义中间件并使用 process_request 函数。不幸的是,似乎没有一种方法可以执行我最初发布的关于使用自定义中间件的内容。我将研究装饰器作为可能的解决方案。 我在发布答案后让它开始工作。我没有尝试任何疯狂的事情,只是在请求中删除了 urlconf 消隐是一回事,替换是另一回事。 是的,不确定格式,但查看了 urlresolvers.py。通过将字符串传递给request.urlconf中的模块,我能够运行一个完全不同的urls.py文件 呃。我没有时间再看下去,但现在我知道了。脱帽致敬,先生

以上是关于在 Django Url Dispatcher 中获取 http 请求数据?这可能吗?如果是这样,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

使用URL dispatcher的范例

URL Router 和 Dispatcher 有啥区别?

SpringMVC - dispatcher servler 的 url 模式样式

phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

BOS1

websocket[tornado] 的单个实例可以处理不同的请求吗?