Django2.0中文(多站点框架)

原文:https://blog.csdn.net/mashaokang1314/article/details/82431705
多个站点共享数据:
1、django.contrib由以下开发包组成:
admin:自动化的站点管理;
admindocs:为Django admin站点提供自动文档;
auth:Django的用户验证框架;
comments:一个评论应用;
contenttypes:一个用于引入文档类型的框架,每个安装的Django模块作为一种独立的文档类型。
csrf:这个模块用来防御跨站请求伪造;
databrowse:帮助你浏览数据的一个用;
flatpages:一个在数据库中管理单一HTML内容的模块;
formtools:一些列表处理表单通用模式的高级库;
gis:为Django提供GIS支持的扩展;
humanize:一系列Django模块过滤器,用于增加数据的人性化。
localflavor:针对不同国家和文化的混杂代码段;
markup:一系列的Django模板过滤器;
redirects:用来管理重定向的框架;
sessions:Django会话框架;
sitemaps:用来生成网站地图的XML文件的框架;
sites:一个让你可以在同一个数据库与Django安装中管理多个网站的框架。
syndication:一个用RSS和Atom来生成聚合订阅源的框架;
webdesign:对设计者非常有用的Django扩展。
2、多站点框架:
位于django.contrib.sites的site模型由domain和name两个字段。
SITE_ID设置指定了与特定配置文件相关联的site对象之数据库的ID。

安装多站点应用要执行以下几个步骤:
将‘django.contrib.sites’加入到INSTALLED_APPS中。
运行manage.py syncdb命令将django_site表安装到数据库中。这样也会建立默认的站点对象,域名为example.com。
把example.com改成自己的域名,然后通过Django admin站点或Python API来添加其他site对象。为该Django项目支撑的每个站点创建一个site对象。
在每个设置文件中定义一个SITE_ID变量。该变量值应当是该设置文件所支撑的站点Site对象的数据库ID。


多个站点的数据重用:
-要在多各站点间重用数据,仅需在模型中为site添加一个多对多字段即可:
from django.db import models
from django.contrib.sites.models import Site

class Article(models.Model):
headline=models.CharField(max_length=200)
sites=models.ManyToManyField(Site)
在适当的位置使用这个技术,你可以在多站点中重度使用统一段Django视图代码:
from django.conf import settings
from django.shortcuts import get_object_or_404
from mysite.articles.models import Article
def article_detail(request, article_id):
a = get_object_or_404(Article, id=article_id, sites__id=settings.SITE_ID)
该视图方法是可重用的,因为它根据SITE_ID设置的值动态检查articles站点。


将内容与单一站点相关联
可以使用外键在多对一关系中将一个模型关联到site模型:
from django.db import models
from django.contrib.sites.models import Site
class Article(models.Model):
headline = models.CharField(max_length=200)
# ...
site = models.ForeignKey(Site)
从视图钩挂当前站点
在底层,通过Django视图中使用多站点框架,可以让视图根据用站点不同而完成不同的工作。
from django.conf import settings
from django.contrib.sites.models import Site
def my_view(request):
current_site = Site.objects.get(id=settings.SITE_ID)
if current_site.domain == 'foo.com':
# Do something
else:
# Do something else.

从site对象中获得settings.SITE_ID值的做法比较常见,因此SIte模型管理具备一个get_current()方法。
from django.contrib.sites.models import Site
def my_view(request):
current_site = Site.objects.get_current()
if current_site.domain == 'foo.com':
# Do something
else:
# Do something else.
获取当前域用于呈现
依据DRY原则(不做重复工作),你只需在一个位置储存站点和域名,然后引用当前Site对象的name和domain。
from django.contrib.sites.models import Site
from django.core.mail import send_mail
def register_for_newsletter(request):
# Check form values, etc., and subscribe the user.
# ...
current_site = Site.objects.get_current()
send_mail('Thanks for subscribing to %s alerts' % current_site.name,
'Thanks for your subscription. We appreciate it.\n\n‐The %s team.' % current_site.name,
'editor@%s' % current_site.domain,
[user_email])
在Lawrence.com 该邮件的标题行是“感谢注册Lawrence.com 提醒信件”。 在 LJWorld.com ,该邮件标题行是“感谢注册 LJWorld.com 提醒信件”。 这种站点关联行为方式对邮件信息主体也同样适用。
完成这项工作的一种更加灵活的方法是使用Django的模板系统。假定Lawrence.com和LJWorld.com拥有各子不同的模板目录,可以将工作轻松地转交给模板系统。
from django.core.mail import send_mail
from django.template import loader, Context
def register_for_newsletter(request):
# Check form values, etc., and subscribe the user.
# ...
subject = loader.get_template('alerts/subject.txt').render(Context({}))
message = loader.get_template('alerts/message.txt').render(Context({}))
send_mail(subject, message, 'do‐not‐reply@example.com', [user_email])
当前站点管理器
如果站点在你的应用中扮演很重要的角色,请考虑在你的模型中使用方便的
CurrentSiteManager。这是一个模型管理器,它会自动过滤使其只包含与当前站点相关联的对象。
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
class Photo(models.Model):
photo = models.FileField(upload_to='/home/photos')
photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
site = models.ForeignKey(Site)
objects = models.Manager()
on_site = CurrentSiteManager()
Photo.objects.all()将返回数据库中所有的Photo对象,而Photo.on_site.all()仅根据SITE_ID设置返回与当前站点相关联的Photo对象。
Photo.objects.filter(site=settings.SITE_ID)
Photo.on_site.all()
这两条是等价的。
CurrentSiteManager是如何知道Photo的哪个字段是Site呢?缺省情况下,它会查找一个叫做site的字段。如果你的模型包含不是site的外键或者多对多关联,需要把它作为参数传给CurrentSiteManager以显示指明。
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
class Photo(models.Model):
photo = models.FileField(upload_to='/home/photos')
photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
publish_on = models.ForeignKey(Site)
objects = models.Manager()
on_site = CurrentSiteManager('publish_on')
如果传入一个不存在的字段名,则会引发异常。
Django的特定部分(即Django超级管理站点和通用视图)使用在模型中定义的第一个管理器,因此如果希望管理站点能够访问所有对象,请于定义CurrentSiteManager之前在模型中放入objects=models.Manager().
Django如何使用多站点框架
即是只用Django来支持单个网站,也应该化一点时间用domain和name来创建站点对象,并将SITE_ID设置指向它的ID。
Django如何使用多站点框架:

在重定向框架中,每一个重定向对象都与一个特定站点关联。当Django搜索重定向的时候,它会考虑当前的SITE_ID.
在注册框架时,每个注释都与特定站点相关。每个注释被显示时,其site被设置为当前的SITE_ID,而当通过适当的模板标签列出注释时,只有当前站点的注释会显示。
在flatpages框架中,每个flatpage都与特定的站点相关联。创建flatpage时,你将指定它的site,而flatpage中间件在获取flatpage以显示它的过程中。将查询当前的SITE_ID.
在syndication框架中,title和description的模板会自动访问变量{{ site }},它其实是代表当前站点的site对象。如果你不指定一个合格的domain的话,提供目录URL的钩子将会使用当前的Site对象的domain。
在权限框架中视图 django.contrib.auth.views.login 把当前 Site 名字和对象分别以 {{ site_name }} 和 {{ site }} 的形式传给了模板。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容