django-6-第三方

来源:互联网 发布:万网单域名控制台 编辑:程序博客网 时间:2024/05/17 23:22

    • 富文本编辑器
      • 下载安装
      • 应用到项目中
      • 自定义使用
    • 缓存
      • 设置缓存
      • 单个view缓存
      • 模板片断缓存
      • 底层的缓存API
    • 全文检索
      • 操作
        • 在虚拟环境中依次安装包
        • 修改settingspy文件
        • 在项目的urlspy中添加url
        • 在应用目录下建立search_indexespy文件
        • 在目录templatessearchindexes应用名称下创建模型类名称_texttxt文件
        • 在目录templatessearch下建立searchhtml
        • 建立ChineseAnalyzerpy文件
        • 复制whoosh_backendpy文件改名为whoosh_cn_backendpy
        • 生成索引
        • 在模板中创建搜索栏
    • celery
      • 名词
      • 使用
    • 布署
      • 服务器介绍
      • 服务器环境配置
      • WSGI
      • uWSGI
      • nginx
      • 静态文件

富文本编辑器

  • 借助富文本编辑器,管理员能够编辑出来一个包含html的页面,从而页面的显示效果,可以由管理员定义,而不用完全依赖于前期开发人员
  • 此处以tinymce为例,其它富文本编辑器的使用可以自行学习
  • 使用编辑器的显示效果为:
    这里写图片描述

下载安装

  • 在网站pypi网站搜索并下载”django-tinymce-2.4.0”
  • 解压
tar zxvf django-tinymce-2.4.0.tar.gz
  • 进入解压后的目录,工作在虚拟环境,安装
python setup.py install

应用到项目中

  • 在settings.py中为INSTALLED_APPS添加编辑器应用
INSTALLED_APPS = (    ...    'tinymce',)
  • 在settings.py中添加编辑配置项
TINYMCE_DEFAULT_CONFIG = {    'theme': 'advanced',    'width': 600,    'height': 400,}
  • 在根urls.py中配置
urlpatterns = [    ...    url(r'^tinymce/', include('tinymce.urls')),]
  • 在应用中定义模型的属性
from django.db import modelsfrom tinymce.models import HTMLFieldclass HeroInfo(models.Model):    ...    hcontent = HTMLField()
  • 在后台管理界面中,就会显示为富文本编辑器,而不是多行文本框

自定义使用

  • 定义视图editor,用于显示编辑器并完成提交
def editor(request):    return render(request, 'other/editor.html')
  • 配置url
urlpatterns = [    ...    url(r'^editor/$', views.editor, name='editor'),]
  • 创建模板editor.html
<!DOCTYPE html><html><head>    <title></title>    <script type="text/javascript" src='/static/tiny_mce/tiny_mce.js'></script>    <script type="text/javascript">        tinyMCE.init({            'mode':'textareas',            'theme':'advanced',            'width':400,            'height':100        });    </script></head><body><form method="post" action="/content/">    <input type="text" name="hname">    <br>    <textarea name='hcontent'>哈哈,这是啥呀</textarea>    <br>    <input type="submit" value="提交"></form></body></html>
  • 定义视图content,接收请求,并更新heroinfo对象
def content(request):    hname = request.POST['hname']    hcontent = request.POST['hcontent']    heroinfo = HeroInfo.objects.get(pk=1)    heroinfo.hname = hname    heroinfo.hcontent = hcontent    heroinfo.save()    return render(request, 'other/content.html', {'hero': heroinfo})
  • 添加url项
urlpatterns = [    ...    url(r'^content/$', views.content, name='content'),]
  • 定义模板content.html
<!DOCTYPE html><html><head>    <title></title></head><body>姓名:{{hero.hname}}<hr>{%autoescape off%}{{hero.hcontent}}{%endautoescape%}</body></html>

缓存

  • 对于中等流量的网站来说,尽可能地减少开销是必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源
  • Django自带了一个健壮的缓存系统来保存动态页面,避免对于每次请求都重新计算
  • Django提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站

设置缓存

  • 通过设置决定把数据缓存在哪里,是数据库中、文件系统还是在内存中
  • 通过setting文件的CACHES配置来实现
  • 参数TIMEOUT:缓存的默认过期时间,以秒为单位,这个参数默认是300秒,即5分钟;设置TIMEOUT为None表示永远不会过期,值设置成0造成缓存立即失效
CACHES={    'default': {        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',        'TIMEOUT': 60,    }}
  • 可以将cache存到redis中,默认采用1数据库,需要安装包并配置如下:
安装包:pip install django-redis-cacheCACHES = {    "default": {        "BACKEND": "redis_cache.cache.RedisCache",        "LOCATION": "localhost:6379",        'TIMEOUT': 60,    },}
  • 可以连接redis查看存的数据
连接:redis-cli切换数据库:select 1查看键:keys *查看值:get

单个view缓存

  • django.views.decorators.cache定义了cache_page装饰器,用于对视图的输出进行缓存
  • 示例代码如下:
from django.views.decorators.cache import cache_page@cache_page(60 * 15)def index(request):    return HttpResponse('hello1')    #return HttpResponse('hello2')
  • cache_page接受一个参数:timeout,秒为单位,上例中缓存了15分钟
  • 视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存

模板片断缓存

  • 使用cache模板标签来缓存模板的一个片段
  • 需要两个参数:
    • 缓存时间,以秒为单位
    • 给缓存片段起的名称
  • 示例代码如下:
{% load cache %}{% cache 500 hello %}hello1<!--hello2-->{% endcache %}

底层的缓存API

from django.core.cache import cache设置:cache.set(键,值,有效时间)获取:cache.get(键)删除:cache.delete(键)清空:cache.clear()

全文检索

  • 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
  • haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架
  • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用
  • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

操作

1.在虚拟环境中依次安装包

pip install django-haystackpip install whooshpip install jieba

2.修改settings.py文件

  • 添加应用
INSTALLED_APPS = (    ...    'haystack',)
  • 添加搜索引擎
HAYSTACK_CONNECTIONS = {    'default': {        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),    }}#自动生成索引HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3.在项目的urls.py中添加url

urlpatterns = [    ...    url(r'^search/', include('haystack.urls')),]

4.在应用目录下建立search_indexes.py文件

# coding=utf-8from haystack import indexesfrom models import GoodsInfoclass GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):    text = indexes.CharField(document=True, use_template=True)    def get_model(self):        return GoodsInfo    def index_queryset(self, using=None):        return self.get_model().objects.all()

5.在目录“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件

#goodsinfo_text.txt,这里列出了要对哪些列的内容进行检索{{ object.gName }}{{ object.gSubName }}{{ object.gDes }}

6.在目录“templates/search/”下建立search.html

<!DOCTYPE html><html><head>    <title></title></head><body>{% if query %}    <h3>搜索结果如下:</h3>    {% for result in page.object_list %}        <a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>    {% empty %}        <p>啥也没找到</p>    {% endfor %}    {% if page.has_previous or page.has_next %}        <div>            {% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; 上一页{% if page.has_previous %}</a>{% endif %}        |            {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}下一页 &raquo;{% if page.has_next %}</a>{% endif %}        </div>    {% endif %}{% endif %}</body></html>

7.建立ChineseAnalyzer.py文件

  • 保存在haystack的安装文件夹下,路径如“/home/python/.virtualenvs/django_py2/lib/python2.7/site-packages/haystack/backends”
import jiebafrom whoosh.analysis import Tokenizer, Tokenclass ChineseTokenizer(Tokenizer):    def __call__(self, value, positions=False, chars=False,                 keeporiginal=False, removestops=True,                 start_pos=0, start_char=0, mode='', **kwargs):        t = Token(positions, chars, removestops=removestops, mode=mode,                  **kwargs)        seglist = jieba.cut(value, cut_all=True)        for w in seglist:            t.original = t.text = w            t.boost = 1.0            if positions:                t.pos = start_pos + value.find(w)            if chars:                t.startchar = start_char + value.find(w)                t.endchar = start_char + value.find(w) + len(w)            yield tdef ChineseAnalyzer():    return ChineseTokenizer()

8.复制whoosh_backend.py文件,改名为whoosh_cn_backend.py

  • 注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格
from .ChineseAnalyzer import ChineseAnalyzer 查找analyzer=StemmingAnalyzer()改为analyzer=ChineseAnalyzer()

9.生成索引

  • 初始化索引数据
python manage.py rebuild_index

10.在模板中创建搜索栏

<form method='get' action="/search/" target="_blank">    <input type="text" name="q">    <input type="submit" value="查询"></form>

celery

官方网站
中文文档
- 示例一:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验
- 示例二:网站每小时需要同步一次天气预报信息,但是http是请求触发的,难道要一小时请求一次吗?
- 使用celery后,情况就不一样了
- 示例一的解决:将耗时的程序放到celery中执行
- 示例二的解决:使用celery定时执行

名词

  • 任务task:就是一个Python函数
  • 队列queue:将需要执行的任务加入到队列中
  • 工人worker:在一个新进程中,负责执行队列中的任务
  • 代理人broker:负责调度,在布置环境中使用redis

使用

  • 安装包
celery==3.1.25celery-with-redis==3.0django-celery==3.1.17
  • 配置settings
INSTALLED_APPS = (  ...  'djcelery',}...import djcelerydjcelery.setup_loader()BROKER_URL = 'redis://127.0.0.1:6379/0'CELERY_IMPORTS = ('应用名称.task')
  • 在应用目录下创建task.py文件
import timefrom celery import task@taskdef sayhello():    print('hello ...')    time.sleep(2)    print('world ...')
  • 迁移,生成celery需要的数据表
python manage.py migrate
  • 启动Redis
sudo redis-server /etc/redis/redis.conf
  • 启动worker
python manage.py celery worker --loglevel=info
  • 调用语法
function.delay(parameters)
  • 使用代码
#from task import *def sayhello(request):    print('hello ...')    import time    time.sleep(10)    print('world ...')    # sayhello.delay()    return HttpResponse("hello world")

布署

  • 从uwsgi、nginx、静态文件三个方面处理

服务器介绍

  • 服务器:私有服务器、公有服务器
  • 私有服务器:公司自己购买、自己维护,只布署自己的应用,可供公司内部或外网访问
  • 公有服务器:集成好运营环境,销售空间或主机,供其布署自己的应用
  • 私有服务器成本高,需要专业人员维护,适合大公司使用
  • 公有服务器适合初创公司使用,成本低
  • 常用的公有服务器,如阿里云、青云等,可根据需要,按流量收费或按时间收费
  • 此处的服务器是物理上的一台非常高、线路全、运行稳定的机器

服务器环境配置

  • 在本地的虚拟环境中,项目根目录下,执行命令收集所有包
pip freeze > plist.txt
  • 通过ftp软件将开发好的项目上传到此服务器的某个目录
  • 安装并创建虚拟环境,如果已有则跳过此步
sudo apt-get install python-virtualenvsudo easy_install virtualenvwrappermkvirtualenv [虚拟环境名称]
  • 在虚拟环境上工作,安装所有需要的包
workon [虚拟环境名称]pip install -r plist.txt
  • 更改settings.py文件
DEBUG = FalseALLOW_HOSTS=['*',]表示可以访问服务器的ip
  • 启动服务器,运行正常,但是静态文件无法加载

WSGI

  • python manage.py runserver:这是一款适合开发阶段使用的服务器,不适合运行在真实的生产环境中
  • 在生产环境中使用WSGI
  • WSGI:Web服务器网关接口,英文为Python Web Server Gateway Interface,缩写为WSGI,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受
  • WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行
  • 命令django-admin startproject会生成一个简单的wsgi.py文件,确定了settings、application对象
    • application对象:在Python模块中使用 application对象与应用服务器交互
    • settings模块:Django需要导入settings模块,这里是应用定义的地方
  • 此处的服务器是一个软件,可以监听网卡端口、遵从网络层传输协议,收发http协议级别的数据

uWSGI

  • uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器
  • uWSGI代码完全用C编写
  • 安装uWSGI
pip install uwsgi
  • 配置uWSGI,在项目中新建文件uwsgi.ini,编写如下配置
[uwsgi]socket=外网ip:端口(使用nginx连接时,使用socket)http=外网ip:端口(直接做web服务器,使用http)chdir=项目根目录wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录processes=4threads=2master=Truepidfile=uwsgi.piddaemonize=uswgi.log
  • 启动:uwsgi –ini uwsgi.ini
  • 停止:uwsgi –stop uwsgi.pid
  • 重启:uwsgi –reload uwsgi.pid
  • 使用http协议查看网站运行情况,运行正常,但是静态文件无法加载

nginx

  • 使用nginx的作用
    • 负载均衡:多台服务器轮流处理请求
    • 反射代理:隐藏真实服务器
  • 实现构架:客户端请求nginx,再由nginx请求uwsgi,运行django框架下的python代码
  • nginx+uwsgi也可以用于其它框架的python web代码,不限于django
  • 到官网下载nginx压缩文件或通过命令安装
sudo apt-get nginx
  • 这里以下载压缩文件为例演示
解压缩:tar zxvf nginx-1.6.3.tar.gz进入nginx-1.6.3目录依次执行如下命令进行安装:./configuremakesudo make install
  • 默认安装到/usr/local/nginx目录,进入此目录执行命令
  • 查看版本:sudo sbin/nginx -v
  • 启动:sudo sbin/nginx
  • 停止:sudo sbin/nginx -s stop
  • 重启:sudo sbin/nginx -s reload
  • 通过浏览器查看nginx运行结果
  • 指向uwsgi项目:编辑conf/nginx.conf文件
sudo conf/nginx.conf在server下添加新的location项,指向uwsgi的ip与端口location / {    include uwsgi_params;将所有的参数转到uwsgi下    uwsgi_pass uwsgi的ip与端口;}
  • 修改uwsgi.ini文件,启动socket,禁用http
  • 重启nginx、uwsgi
  • 在浏览器中查看项目,发现静态文件加载不正常,接下来解决静态文件的问题

静态文件

  • 静态文件一直都找不到,现在终于可以解决了
  • 所有的静态文件都会由nginx处理,不会将请求转到uwsgi
  • 配置nginx的静态项,打开conf/nginx.conf文件,找到server,添加新location
location /static {    alias /var/www/test5/static/;}
  • 在服务器上创建目录结构“/var/www/test5/”
  • 修改目录权限
sudo chmod 777 /var/www/test5
  • 创建static目录,注意顺序是先分配权限,再创建目录
mkdir static
  • 最终目录结构如下图:
    这里写图片描述
  • 修改settings.py文件
STATIC_ROOT='/var/www/test5/static/'STATIC_URL='/static/'
  • 收集所有静态文件到static_root指定目录:python manage.py collectstatic
  • 重启nginx、uwsgi
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 37周b超宝宝腿短怎么办 3岁的宝宝说话说不好怎么办 小儿说话晚的原因宝宝说话晚怎么办 22岁的儿子在家不说话怎么办 儿子2周4个月了不说话怎么办 三岁的宝宝还不会数数怎么办 2岁宝宝晚上不睡觉不听话怎么办 8个月的狗狗怕人不敢出门怎么办 狗太怕人了怎么办都不敢出门 媳妇和婆婆晚上都不想带孩子怎么办 婆婆和媳妇带孩子观念不一样怎么办 婆婆给媳妇买了不喜欢的家具怎么办 断奶后宝宝对奶粉很抗拒怎么办 两岁宝宝断奶不喝奶粉怎么办 宝宝两岁了断奶后奶粉不吃怎么办 宝宝断奶两天了不愿意吃奶粉怎么办 一岁四个月宝宝断奶不喝奶粉怎么办 四个月宝宝断奶不喝奶粉怎么办 四个月宝宝断奶后不吃奶粉怎么办 2岁的宝宝不开口说话怎么办 一周岁宝宝断奶不喝奶粉怎么办 八个月宝宝断奶不喝奶粉怎么办 婆家人总是用心机对待娘家人怎么办 婆婆老是背后说我娘家人坏话怎么办 婆家姐带孩子住娘家不走怎么办? 老是想在娘家不想回婆家怎么办 娘家和婆家同时向我借钱怎么办 土地确权后娘家婆家都没有怎么办 结了婚婆家向娘家借钱怎么办? 婆婆的娘家人从我家住怎么办 八个月宝宝断奶后不吃奶粉怎么办 吃母乳的宝宝不吸奶嘴怎么办 宝宝吸了奶嘴不吸母乳怎么办 婴儿吃了奶嘴不吸母乳怎么办 十一个月宝宝断奶不喝奶粉怎么办 孩子三门成绩全不及格家长该怎么办 宝宝快十个月了还不会爬怎么办 小孩写字老把手向里扭曲怎么办 孩子该上四年级了数学差的很怎么办 孩子上三年级了数学成绩好差怎么办 三年级数学老考70-80分怎么办