国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 建站知識 > Django二級域名路由配置方案django-hosts

Django二級域名路由配置方案django-hosts

時間:2023-02-08 00:44:01 | 來源:建站知識

時間:2023-02-08 00:44:01 來源:建站知識

最終效果

項目結(jié)構

基礎配置

# blogs/settings.py ALLOWED_HOSTS = [ '.mydomain.cn', # 匹配.mydomain.cn的所有域名]修改主機的hosts,以支持域名訪問本地服務,且服務運行在80端口run server 0.0.0.0:80測試。

127.0.0.1 www.mydomain.cn127.0.0.1 blog.mydomain.cn127.0.0.1 api.mydomain.cn

項目主urls

from django.contrib import adminfrom django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls', namespace='blog')), path('api/', include('api.urls', namespace='api')), path('', include('www.urls', namespace='www')),]

項目 www - url

from django.urls import pathfrom .views import index app_name = 'www' urlpatterns = [ path('', index, name='index'),]<!-- apps/www/templates/www/index.html --> <h2>項目主頁</h2><h4><a href="{% url 'blog:index' %}">博客</a></h4><h4><a href="{% url 'api:index' %}">接口</a></h4>訪問 http://www.mydomain.cn/

博客blog urls apps/blog/urls.py

from django.urls import pathfrom .views import index, blog_list, blog_detail app_name = 'blog' urlpatterns = [ path('', index, name='index'), path('list/', blog_list, name='list'), path('detail/<str:blog_id>/', blog_detail, name='detail'),]<!-- apps/blog/templates/blog/index.html --> <h2>BLOG主頁</h2><a href="{% url 'blog:list' %}">進入BLOG列表</a><!-- apps/blog/templates/blog/list.html --> <h4><a href="{% url 'blog:index' %}">返回BLOG主頁</a></h4><ul> <li><a href="{% url 'blog:detail' 1 %}">進入BLOG詳情1</a></li> <li><a href="{% url 'blog:detail' 2 %}">進入BLOG詳情2</a></li></ul><!-- apps/blog/templates/blog/detail.html --> <h2>BLOG詳情</h2><h4><a href="{% url 'blog:list' %}">返回BLOG列表</a></h4><b>BLOG正文:</b>當前訪問的ID:{{ blog_id }}

django-hosts配置

實現(xiàn) http://www.mydomain.cn/blog/ --> http://blog.mydomain.cn/

現(xiàn)在如果直接訪問 http://blog.mydomain.cn/ 是顯示的項目主頁,因為沒有具體路徑的url都由path('', include('www.urls', namespace='www')),去匹配

安裝

pip install django-hosts

配置settings.py

添加 django_hosts 到 INSTALLED_APPS

# blogs/settings.py INSTALLED_APPS = [ ...... 'django_hosts', # pip install django-hosts 安裝,添加app(第1步) ......] MIDDLEWARE = [ 'django_hosts.middleware.HostsRequestMiddleware', # django-hosts 必須添加到最前面(第2步) 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django_hosts.middleware.HostsResponseMiddleware', # django-hosts 必須添加到最后面(第3步)]在主項目下創(chuàng)建hosts.py 文件,創(chuàng)建一個包含默認主機模式的新模塊

第4步,在ROOT_URLCONF之后增加,指定hosts.py文件可引用位置,設置 ROOT_HOSTCONF 包含hosts.py文件的模塊

# blogs/settings.py ROOT_HOSTCONF = 'blogs.hosts' 第5步,設置DEFAULT_HOST,沒匹配到的就用該模式,django-hosts ROOT_HOSTCONF之后增加,設置默認模式匹配。如果沒有其他模式匹配,或者沒有為host_url模板標記指定名稱,則將使用它。

# blogs/settings.py DEFAULT_HOST = 'www'第6步設置PARENT_HOST顯示域部分,如果想在呈現(xiàn)的URL的域部分附加一個默認域名,否則就只有“blog/index/”,而不是“blog.domain.cn/index/”

# blogs/settings.py PARENT_HOST = 'mydomain.cn'

配置hosts.py

# blogs/hosts.py """創(chuàng)建一個包含默認主機模式的新模塊的hosts.py文件中。"""from django.conf import settingsfrom django_hosts import patterns, host host_patterns = patterns('', # 配置模式的正則表達式,如果要使用https,在需要的host中增加 scheme='https://' 屬性(第7步) host(r'www', settings.ROOT_URLCONF, name='www'), # 域名城-網(wǎng)絡品牌門戶 域名注冊、預訂競價、域名交易、域名經(jīng)紀、域名資訊、投資交流平臺 直接請求主urls中配置的路由 host(r'api', 'api.urls', name='api'), # http://api.mydomain.cn/ host(r'blog', 'blog.urls', name='blog'), # http://blog.mydomain.cn/)此時刷新 http://blog.mydomain.cn/ 是會報錯的

django.urls.exceptions.NoReverseMatch: 'blog' is not a registered namespace

配置html

在模板中,可以使用host_url()template tag來反向使用Django的URL template tag,需要添加{% load hosts %}

<!-- apps/blog/templates/blog/index.html --> {% load hosts %}<h2>BLOG主頁</h2>{#<a href="{% url 'blog:list' %}">進入BLOG列表</a>#}<h4><a href="{% host_url 'list' host 'blog' %}">進入BLOG列表(django-hosts)</a></h4>就不能使用<a href="{% url 'blog:list' %}">進入BLOG列表</a>,這會導致報錯。

注意:任何與該App有關的用過host_url的模板中,都不能出現(xiàn)Django中的url,否則會出現(xiàn)問題'app' is not a registered namespace

現(xiàn)在BLOG列表的鏈接就是http://blog.mydomain.cn/list/

<!-- apps/blog/templates/blog/list.html --> {% load hosts %}<h4><a href="{% host_url 'index' host 'blog' %}">返回BLOG主頁</a></h4><ul>{# <li><a href="{% url 'blog:detail' 1 %}">進入BLOG詳情1</a></li>#}{# <li><a href="{% url 'blog:detail' 2 %}">進入BLOG詳情2</a></li>#} <li><a href="{% host_url 'detail' 1 host 'blog' %}">進入BLOG詳情1</a></li> <li><a href="{% host_url 'detail' 2 host 'blog' %}">進入BLOG詳情2</a></li></ul>如果是需要傳遞參數(shù)<li><a href="{% url 'blog:detail' 1 %}">進入BLOG詳情1</a></li>,也要做類似的改動<li><a href="{% host_url 'detail' 1 host 'blog' %}">進入BLOG詳情1(django-hosts)</a></li>

現(xiàn)在BLOG詳情的鏈接就是http://blog.mydomain.cn/detail/1/

<!-- apps/blog/templates/blog/detail.html --> {% load hosts %}<h2>BLOG詳情</h2><h4><a href="{% host_url 'list' host 'blog' %}">返回BLOG列表</a></h4><b>BLOG正文:</b>當前訪問的ID:{{ blog_id }}

視圖中反向url

在Python方面,比如視圖,類似于Django的單向函數(shù)。只需使用django_hosts中的reverse()函數(shù)

# apps/blog/views.py from django.shortcuts import renderfrom django_hosts.resolvers import reverse def index(request): blog_99_url = reverse('detail', args=(99,), host='blog') return render(request, 'blog/index.html', {'blog_99_url': blog_99_url})在模板中顯示該url

<!-- apps/blog/templates/blog/index.html --> <!DOCTYPE html>{% load hosts %}<html lang="en"><head> <meta charset="UTF-8"> <title>BLOG主頁</title></head><body><h2>BLOG主頁</h2>{#<a href="{% url 'blog:list' %}">進入BLOG列表</a>#}<h4><a href="{% host_url 'list' host 'blog' %}">進入BLOG列表(django-hosts)</a></h4><a href="{{ blog_99_url }}" target="_blank">推薦閱讀 {{ blog_99_url }}</a></body></html>得到blog_99_url的連接為http://blog.mydomain.cn/detail/99/

點進去就可以得到

media文件加載404問題

修改原App urls.py

# blog urls apps/blog/urls.py from django.conf import settingsfrom django.conf.urls.static import staticfrom django.urls import pathfrom .views import index, blog_list, blog_detail app_name = 'blog' urlpatterns = [ path('', index, name='index'), path('list/', blog_list, name='list'), path('detail/<str:blog_id>/', blog_detail, name='detail'),] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)當DEBUG模式時,增加media的路徑,而不用hosts時,media是配置到項目主 urls.py 中的

Nginx的配置只需要將子域名都綁定到對應的啟動端口即可,后端根據(jù)子域名進行不同的路由。 另外這也會存在跨域問題,比如http://blog.mydomain.cn/登錄是在http://www.mydomain.cn/usercenter/login/這個鏈接。

https://github.com/fungitive/blogs-domian

關鍵詞:配置,方案

74
73
25
news

版權所有? 億企邦 1997-2025 保留一切法律許可權利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉