【问题标题】:Get user from URL segment with Django使用 Django 从 URL 段获取用户
【发布时间】:2010-07-26 09:54:02
【问题描述】:

我有一个 web 应用程序,它将根据 url 的第一部分返回一个用户 ID,就像 Twitter:

http://www.myapplication.com/user-name-goes-here/

它也可以更深入,像这样:

http://www.myapplication.com/user-name-goes-here/news/article_1/

为了分解网站,我使用了以下 URL 路由技术:

(r'^(?P<slug>\w+)/', include('myapp.sites.urls')),

这将进一步将用户路由到正确的页面,但就目前而言,我必须在每个视图中查询数据库才能根据第一个 url 段获取 user_id。我希望以某种方式自动执行此操作,这样我就不必每次都使用相同的代码来膨胀我的视图...我的解决方案是创建一些中间件来检查 url 段并在未找到时返回 404:

    from django.http import Http404

class DomainMiddleware(object):
    def process_request(self, request):
        from myapp.sites.models import Sites

        dname = request.path.split('/')[1]
        if not dname:
            return
        try:
            d = Sites.objects.get(domain__exact=dname)
        except Sites.DoesNotExist:
            raise Http404

        return

这可行,但它会尝试解析每个请求,甚至是图像、网站图标等的请求。

我的问题是这样的;有没有办法在每次页面加载时运行此查询,而不会用额外的代码阻塞我的视图?如果中间件是解决方案,我该如何修改我的代码,使其不包含每个请求,只包含那些成功路由 URL 的请求?

希望有人能提供帮助!

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    Django 服务器不应该处理对静态内容 URL 的请求 - 无论如何肯定不会在生产环境中运行,您需要运行不同的 Web 服务器来处理它,所以这应该不是问题。

    但是,如果您说您希望它仅针对成功路由的 URL 运行,也许您最好在中间件中使用 process_view 而不是 process_request? http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view

    process_view 在视图级别而不是请求级别工作,并提供一个 view_func 参数,您可以检查该参数,以便您的代码在开发期间用于提供静态媒体的 django.views.static.serve 视图时不会运行。

    如果要在每个视图上使用该数据库调用,无论发生什么情况,您都应该缓存该数据库调用。

    【讨论】:

    • 非常感谢您的回复,真的很有帮助。我肯定会缓存查询,但显然我需要确保它至少运行一次,特别是如果您进一步进入用户页面(这就是为什么我需要它在每个视图上运行)。干杯!
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2020-06-05
    • 2019-02-19
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多