Django插件之Django-hosts的应用
Django插件之Django-hosts的应用
前因
网站移动端的域名是m.example.com,最开始只是在nginx做了映射,将m.example.com映射到example.com/m/下面,的确是可以访问到,但是后面发现这样做的坏处就是浏览器在浏览的时候,浏览器上面的URL会是example.com/m/xxxxx这样的,而不是按预想的二级域名那样,而且看了一些关于seo优化的,移动适配方面是不建议把移动站的页面作为PC站网站中的一个子目录来配置的,所以必须做出改变。
解决方法
现在养成个好习惯就是,有问题除了先搜为敬之外,还会回官方文档看有没有相关的解释。回到官网一看,官网文档部分的页面就是用了二级域名的,因为官网的源码是开源的,所以立刻上gayhub,就发现这个功能是用Django-hosts来实现的。
简单使用说明
Django-hosts的官方文档。
个人理解:这个插件的作用其实是类似我们项目中的urls.py
,也是做路由,只不过他是用中间件形式,在相对更外面一层,分析整个URL,而我们的urls.py
在相对里面一点,只分析主域名后面的路径。
下载安装
直接用万能的pip
就可以了。
配置
- 把
django_hosts
加到mysite.settings
的INSTALLED_APPS
中。 - 把
django_hosts.middleware.HostsRequestMiddleware
加到MIDDLEWARE
的开头。 - 把
django_hosts.middleware.HostsResponseMiddleware
加到MIDDLEWARE
的结尾。 - 创建
hosts.py
文件,直接放在mysite
下面就好了。 - 在
mysite.settings
中加上ROOT_HOSTCONF = mysite.hosts
,注意后面的这个值取决于你第四步创建文件的位置。 - 在
mysite.settings
中加上DEFAULT_HOST = xxx
,就是设置路由的首选项,这个可以后面再回来看,拿下面这个例子来讲,一般就是设成DEFAULT_HOST = 'www'
。
官网的hosts.py
例子:
from django.conf import settings
from django_hosts import patterns, host
host_patterns = patterns('',
host(r'www', settings.ROOT_URLCONF, name='www'),
host(r'(\w+)', 'path.to.custom_urls', name='wildcard'),
)
这个host_patterns
的形式其实是跟url_patterns
是很像的,第一个host
的意思就是,以www
开头的,也就是www.example.com
形式的,是用settings.ROOT_URLCONF
来进行路由,而这个settings.ROOT_URLCONF
的默认值就是mysite.urls
,是不是感觉到什么了,没错,这个hosts文件和项目urls.py
文件的关系就像项目urls.py
和app的urls.py
的关系那样,逐层路由,最后的name
参数就是为这个规则命名而已。
第二个host
是用了正则匹配来匹配URL开头,然后第二个参数是URL配置文件的路径。
这个插件中实现了一个自定义的template tag
,在模板文件里可以直接{load hosts}
,后面调用{% host_url 'view_name' host 'host_name'%}
就可以生成对应host的URL。
而在python文件里,这个插件提供了个跟Django内置reverse()
一样的接口
from django.shortcuts import render
from django_hosts.resolvers import reverse
def homepage(request):
homepage_url = reverse('homepage', host='www')
return render(request, 'homepage.html', {'homepage_url': homepage_url})
用法与内置的几乎一致,只不过是要多添加一个host
的参数来指明要用哪个host。
遇到的问题
关于路径参数
就是对应APP的URL配置文件的地址,记住这个APP要在settings
里注册。
关于本地调试
在运行本地调试的时候,m.127.0.0.1:8000
是访问不到的啊。。我到现在也没找到解决方法,所以说没办法进行本地调试,只能直接上服务器调。
URL的概念
URL的核心是协议加地址,也就是说必须是要以http
或者https
这些开头的,而不是www
。这设置转发的时候,要注意,一开始就是只设置www
开头的,导致转发不成功。
Django插件之Django-hosts的应用的更多相关文章
- django中的django admin插件
一.django admin前言 1.admin的作用 为了方便后台开发者快速的部署测试环境,于是就产生了admin,admin主要是操作models中的类从而实现对数据库中的数据增删改查的操作. 2 ...
- Django 插件之 Xadmin实现富文本编辑器
此文为前一篇文章的续写: Django 插件之 Xadmin Ueditor 介绍 UEditor 是由百度 web 前端研发部开发所见即所得富文本 web 编辑器,具有轻量,可定制,注重用户体验等特 ...
- Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期
Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...
- 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- 【Django】Django 如何使用 Django设置的日志?
代码: from django.core.management.base import BaseCommand, CommandError from django.db import models # ...
- [Django高级]理解django中的中间件机制和执行顺序
原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...
- Python Django 1.Hello Django
#安装Djangopip install Django #==版本号#选择路径:D:#任意文件夹名 cd Django #罗列Django所提供的命令,其中startproject命令来创建项目 dj ...
- Django学习之django自带的contentType表 GenericRelation GenericForeignKey
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...
随机推荐
- 获取SQL Server数据库中的表和字段描述
获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, ...
- Windows bat 学习(高级)
有一种叫做 Command Processor Extensions 的东西,即命令处理器扩展.他会使命令更加高级,功能更多. 在 cmd 里可以使用 ECHO %CMDEXTVERSION% 查看当 ...
- mysql开启远程连接及本地连接
问题描述 在本机windows上连接linux服务器上的mysql报错:host'XXX' is not allowed to connect to this mysql server. 这个错误是由 ...
- 线性筛的同时得到欧拉函数 (KuangBin板子)
线性筛的思想:每个被筛的数是通过它最小的质因子所筛去的. 这种思想保证了每个数只会被筛一次,从而达到线性.并且,这个思想实现起来非常巧妙(见代码注释)! 因为线性筛的操作中用到了倍数的关系去实现,因此 ...
- 灵活、可高度自定义的——Progress进度圈、弹窗、加载进度、小菊花
DDProgressHUD的介绍 提供了四种类型的展示: 显示无限旋转的加载图(比如小菊花,可以自定义),显示文字信息.网络刷新时经常用到. 显示加载进度的动画,也可以显示文字.网络下载时用的比较多, ...
- linux笔记_day12_shell编程
1.shell中如何进行算术运算 A=1 B=2 1)let 算术运算表达式 let C=$A+$B 2)$[算术运算表达式] C=$[$A+$B] 3)$(($A+$B)) 4) expr 算术表达 ...
- Nginx是什么,有什么优点?为什么选择Nginx做web服务器软件?(经典经典)
1.基础知识 代理服务器: 一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器. 一个完整的代理请求过程为:客 ...
- 让linux中 history显示每条命令的操作时间及操作用户【转】
一.history 中显示日期时间用户名的办法 history 命令,用来显示命令行上的操作记录 不过默认是仅显示操作命令行本身,而没有记录操作时间等细节 例如 这样,我们查找记录时很麻烦,想回顾下某 ...
- centos7系统下安装配置jdk、tomcat教程
JDK安装与配置 1.下载linux版本的jdk,我下的版本是jdk6.0,下载rpm版本的. 可通过百度搜索文件名:jdk-6u45-linux-x64-rpm.bin下载 也可通过oracle官网 ...
- 使用crontab命令添加计划任务
Ubuntu 16.04, 计划任务 就是 有(时间)计划地执行(做)任务,有计划 包括 定时执行(在哪些时间点执行任务).按照周期执行(每隔多少时间执行任务). 那么,什么是任务呢?就是 自己想要干 ...