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就可以了。

配置

  1. django_hosts加到mysite.settingsINSTALLED_APPS中。
  2. django_hosts.middleware.HostsRequestMiddleware加到MIDDLEWARE的开头。
  3. django_hosts.middleware.HostsResponseMiddleware加到MIDDLEWARE的结尾。
  4. 创建hosts.py文件,直接放在mysite下面就好了。
  5. mysite.settings中加上ROOT_HOSTCONF = mysite.hosts,注意后面的这个值取决于你第四步创建文件的位置。
  6. 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的应用的更多相关文章

  1. django中的django admin插件

    一.django admin前言 1.admin的作用 为了方便后台开发者快速的部署测试环境,于是就产生了admin,admin主要是操作models中的类从而实现对数据库中的数据增删改查的操作. 2 ...

  2. Django 插件之 Xadmin实现富文本编辑器

    此文为前一篇文章的续写: Django 插件之 Xadmin Ueditor 介绍 UEditor 是由百度 web 前端研发部开发所见即所得富文本 web 编辑器,具有轻量,可定制,注重用户体验等特 ...

  3. Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期

    Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...

  4. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  5. 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  6. 【Django】Django 如何使用 Django设置的日志?

    代码: from django.core.management.base import BaseCommand, CommandError from django.db import models # ...

  7. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  8. Python Django 1.Hello Django

    #安装Djangopip install Django #==版本号#选择路径:D:#任意文件夹名 cd Django #罗列Django所提供的命令,其中startproject命令来创建项目 dj ...

  9. Django学习之django自带的contentType表 GenericRelation GenericForeignKey

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

随机推荐

  1. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

  2. SpringBoot 读取配置文件及profiles切换配置文件

    读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 先创 ...

  3. Spring RedisTemplate操作-String操作(2)

    @Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...

  4. JavaScript编写风格指南 (一)

    //参考<编写可维护的Javascript>  一:缩进// 第一行的层级由4个空格组成,避免使用制表符tab进行缩进 //好的写法if (true) {    doSomething() ...

  5. CSS marging相关

    一.margin可以为负值 在盒模型中,内容区的width/height.padding.border都不能为负值,但是margin例外,它可以为负值. margin负值的本质,在于它改变了元素在普通 ...

  6. C语言内存分布

    C语言内存分布 典型的C语言程序内存表示分区共有5个部分: 正文段 Text segment 已初始化数据段(数据段)Initialized data segment 未初始化数据段(bss)Unin ...

  7. 学习mysql replication gitd

  8. MySql 死锁时的一种解决办法【转】

    转自:http://blog.csdn.net/mchdba/article/details/38313881 之前也遇到一次,今天又遇到了这个问题,所以这次必须解决,网上找到这篇文章帮了大忙,方便以 ...

  9. Mac安装MAT报错问题

    安装mat报错,提示在/.eclipse/1528649425_macosx_cocoa_x86_64/configuration/1539332382530.log路径下查看错误日志, 原因是/pr ...

  10. linux如何查看端口被哪个进程占用?

    参考:https://jingyan.baidu.com/article/546ae1853947b71149f28cb7.html 1.lsof -i:端口号 2.netstat -tunlp|gr ...