在 django Web 应用程序中,如何为用户提供自己的子域?

发布于 2024-07-14 12:51:32 字数 379 浏览 6 评论 0原文

我正在使用 Django 和 Pinax 启动一个新的 Web 应用程序项目。 我希望能够为我的用户提供独特的域名,就像 Wordpress 和其他网站一样:username.wordpress.com。 我不知道如何用 Django 来解决这个问题,因为 url 解析逻辑(在 urls.py 中)从域名后面的 url 开始。

更具体地说,将有多个用户组,每个组都有唯一的名称。 不确定这有什么不同,但我想我应该提到这一点。

有什么方法可以操纵http请求,以便URL在Django看来就像是www.domain.com/groupname,但仍然在浏览器地址栏中显示为groupname.domain.com

I'm starting a new web app project using Django and Pinax. I want to be able to give my users unique domain names like Wordpress and other sites do : username.wordpress.com. I'm not sure how to approach this with Django, since the url parsing logic (in urls.py) starts with the url AFTER the domain name.

More specifically, there will be multiple groups of users, each group having a unique name. Not sure that makes a difference, but I thought I should mention that.

Is there some way I can manipulate the http request so that the URL looks to Django as if the url were something like www.domain.com/groupname, but still showed in the browser address bar as groupname.domain.com?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一江春梦 2024-07-21 12:51:32

您可以使用一些自定义中间件来拦截请求并从中获取子域。 以下代码将检索子域并通过反转命名来重定向到视图网址

将其放入应用程序的 middleware.py 文件中。

确保在 settings.py 文件中设置中间件。

确保您已在 urls.py 中命名视图

middleware.py

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
import re

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?')

class SubdomainMiddleware(object):
    def process_request(self, request):
        match = subdomain_pattern.match(request.get_host())
        subdomain = match.group('subdomain')
        redirect_url = reverse('groups_detail', args=[subdomain])
        return HttpResponseRedirect(redirect_url)

urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^groups/(?P<name>.+)/

注意:此代码未经测试。

重定向可能会改变URL 的外观。 如果您想避免这种情况,只需调用关联的视图,捕获其结果,然后在 HttpResponse() 中返回它。

, 'groups.views.detail', {}, name='group_detail'), )

注意:此代码未经测试。

重定向可能会改变URL 的外观。 如果您想避免这种情况,只需调用关联的视图,捕获其结果,然后在 HttpResponse() 中返回它。

You can use some custom middleware to intercept the request and get the subdomain from it. The following code will retrieve the subdomain and redirect to a view by reversing the named url.

Put it in a middleware.py file in your app.

Make sure you set up the middleware in your settings.py file.

Make sure you've named your view in urls.py

middleware.py

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
import re

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?')

class SubdomainMiddleware(object):
    def process_request(self, request):
        match = subdomain_pattern.match(request.get_host())
        subdomain = match.group('subdomain')
        redirect_url = reverse('groups_detail', args=[subdomain])
        return HttpResponseRedirect(redirect_url)

urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^groups/(?P<name>.+)/

Note: this code is untested.

Redirecting can alter the URL's appearance. If you want to avoid this, simply call the associated view, capture its result, and return it in an HttpResponse().

, 'groups.views.detail', {}, name='group_detail'), )

Note: this code is untested.

Redirecting can alter the URL's appearance. If you want to avoid this, simply call the associated view, capture its result, and return it in an HttpResponse().

梦里°也失望 2024-07-21 12:51:32

您需要通过网络服务器来处理这个问题。 如果您有像...这样的 Django url

/users/<username>/

,则在网络服务器中使用重写规则将 .domain.com 映射到 domain.com/users//。

如果您使用的是 Apache,则可以在此处阅读。 否则,每个网络服务器都有自己的约定,但都支持 url 重写的概念。

You need to handle this via your webserver. If you have Django urls like...

/users/<username>/

... then use rewrite rules in the webserver to map <username>.domain.com to domain.com/users/<username>/.

If you're using Apache, you can read up here. Otherwise, each webserver has their own conventions but all will support the notion of url rewrites.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文