最终效果

  • http://www.mydomain.cn/api/ --> http://api.mydomain.cn/
  • http://www.mydomain.cn/blog/ --> http://blog.mydomain.cn/
  • http://www.mydomain.cn/ --> http://www.mydomain.cn/ 保持不变

项目结构

基础配置

# blogs/settings.pyALLOWED_HOSTS = ['.mydomain.cn',  # 匹配.mydomain.cn的所有域名
]

修改主机的hosts,以支持域名访问本地服务,且服务运行在80端口run server 0.0.0.0:80测试。

127.0.0.1 www.mydomain.cn
127.0.0.1 blog.mydomain.cn
127.0.0.1 api.mydomain.cn

项目主urls

from django.contrib import admin
from django.urls import path, includeurlpatterns = [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 path
from .views import indexapp_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 path
from .views import index, blog_list, blog_detailapp_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配置

实现 http://www.mydomain.cn/blog/ --> http://blog.mydomain.cn/

现在如果直接访问 http://blog.mydomain.cn/ 是显示的项目主页,因为没有具体路径的url都由path('', include('www.urls', namespace='www')),去匹配

安装

pip install django-hosts

配置settings.py

添加 django_hostsINSTALLED_APPS

# blogs/settings.pyINSTALLED_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步)
]

在主项目下创建hosts.py 文件,创建一个包含默认主机模式的新模块

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

# blogs/settings.pyROOT_HOSTCONF = 'blogs.hosts'

第5步,设置DEFAULT_HOST,没匹配到的就用该模式,django-hosts  ROOT_HOSTCONF之后增加,设置默认模式匹配。如果没有其他模式匹配,或者没有为host_url模板标记指定名称,则将使用它。

# blogs/settings.pyDEFAULT_HOST = 'www'

第6步设置PARENT_HOST显示域部分,如果想在呈现的URL的域部分附加一个默认域名,否则就只有“blog/index/”,而不是“blog.domain.cn/index/”

# blogs/settings.pyPARENT_HOST = 'mydomain.cn'

配置hosts.py

# blogs/hosts.py"""
创建一个包含默认主机模式的新模块的hosts.py文件中。
"""
from django.conf import settings
from django_hosts import patterns, hosthost_patterns = patterns('',  # 配置模式的正则表达式,如果要使用https,在需要的host中增加 scheme='https://' 属性(第7步)host(r'www', settings.ROOT_URLCONF, name='www'),  # http://www.domain.cn/ 直接请求主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 %}

  • BLOG主页
<!-- 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的模板中,都不能出现Django中的url,否则会出现问题'app' is not a registered namespace

现在BLOG列表的链接就是http://blog.mydomain.cn/list/

  • BLOG列表
<!-- 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>

如果是需要传递参数<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>

现在BLOG详情的链接就是http://blog.mydomain.cn/detail/1/

  • BLOG详情
<!-- 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的单向函数。只需使用django_hosts中的reverse()函数

# apps/blog/views.pyfrom django.shortcuts import render
from django_hosts.resolvers import reversedef 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.pyfrom django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from .views import index, blog_list, blog_detailapp_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的配置只需要将子域名都绑定到对应的启动端口即可,后端根据子域名进行不同的路由。 另外这也会存在跨域问题,比如http://blog.mydomain.cn/登录是在http://www.mydomain.cn/usercenter/login/这个链接。

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

Django二级域名路由配置方案django-hosts相关推荐

  1. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  2. tp5二级域名如何配置

    tp5二级域名如何配置 比如:首页:www.yuming.com 第一步:先宝塔添加站点设置 例如:www.yuming.com wz.yuming.com 第二步:使用tp5的路由规则Route:: ...

  3. Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM...

    web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...

  4. windows下 apache 二级域名相关配置

    小编今天给大家总结下 windows 下 apache的二级域名的相关配置 利用.htaccess将域名绑定到子目录 下面就利用本地127.0.0.1进行测试 我们这里以 www.jobs.com 为 ...

  5. 二级域名session共享php本地,PHP二级域名session共享方案

    一般来讲网站都会有主站和子站,比如域名是abc.com,那么一般来讲abc.com和www.abc.com就会是主站,而像bbs.abc.com就会作为论坛而存在的子站. 而且要注意的是,虽然一般设置 ...

  6. php5.6 开二级域名,PHP二级域名session共享方案

    一般来讲网站都会有主站和子站,比如域名是linuxidc.com,那么一般来讲linuxidc.com和www.linuxidc.com就会是主站,而像bbs.linuxidc.com就会作为论坛而存 ...

  7. php支持二级域名共享,PHP二级域名session共享方案

    一般来讲网站都会有主站和子站,比如域名是linuxidc.com,那么一般来讲linuxidc.com和www.linuxidc.com就会是主站,而像bbs.linu 一般来讲网站都会有主站和子站, ...

  8. VUE二级/多级路由配置方式(嵌套路由)

    二级路由中path写法不同对应router-link标签to属性的不同写法 二级路由配置path:"/XXX",path中带/ ,则对应的路由导航router-link中的to属性 ...

  9. React+Nginx 二级域名指向配置

    使React线上项目二级域名指向端口 欢迎使用Markdown编辑器 开始前检查你的Nginx 检查是否正常 编写nginx.conf 在同级目录的conf.d目录里 清理一下缓存 欢迎使用Markd ...

最新文章

  1. IDEA、webstorm设置编辑器恶心的竖线位置、隐藏竖线(参考线),然后代码自动换行
  2. matlab7.0怎么用,matlab7.0中simulink使用
  3. EGLSurfaces 和 OpenGL ES
  4. SAP Commerce Cloud如何针对Spartacus进行安装
  5. 每日一题(3)—— -2与2的比较(二)
  6. [转载]用消息队列和消息应用状态表来消除分布式事务
  7. win10开始不显示python_win10从零安装配置pytorch全过程图文详解
  8. 【[USACO13NOV]没有找零No Change】
  9. linux tomcat 部署 JCO,JCO连接SAP时tomcat报错
  10. 2021-2027全球与中国成像雷达市场现状及未来发展趋势
  11. 解决找不到 C 盘中的 AppData 文件夹的问题
  12. 声律启蒙--喜欢这个韵律
  13. phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结)
  14. 教你如何刻录极品CD音乐碟
  15. gcc 中-O1 -O2 -O3 优化的原理
  16. 海贼王热血航线正在连接服务器,海贼王热血航线为什么连接不了服务器?老是说人已满进不去?...
  17. 实验吧:天网管理系统
  18. matlab 稀疏随机矩阵,Matlab 稀疏矩阵函数
  19. 蓝桥杯java B组历年省赛真题汇总及题目详解
  20. 肾内科护理 100326

热门文章

  1. DICOM医学影像文件解析
  2. 二维码和条形码简单实现
  3. 谨慎处理单片机中断,中断等价于比主程序优先级更高的线程
  4. 企业管理软件领域的核心竞争力
  5. 西瓜书课后题——第七章(贝叶斯分类器)
  6. Android点9图机制及在聊天气泡中的应用
  7. JS生成随机字符,生成一堆高逼格的乱码。。。
  8. python文件是什么的集合和抽象_python学习笔记(三):文件操作和集合
  9. 内置函数 ,匿名函数
  10. 将搜狗输入法默认的中文输入更改成英文