1.富文本编辑器

  tinymce为例

安装

  1. pip install django-tinymce

在settings.py中的配置 

配置应用

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'booktest',
  9. 'tinymce',
  10. ] 

配置设定(主题和大小等)----在settings.py的最后面加

  1. TINYMCE_DEFAULT_CONFIG = {
  2. 'theme': 'advanced',
  3. 'width': 600,
  4. 'height': 400,
  5. }

根目录的urls.py中配置url

  1. url(r'^tinyme/', include('tinymce.urls')),

models.py中定义模型类

  1. from django.db import models
  2. from tinymce.models import HTMLField
  3.  
  4. # Create your models here.
  5.  
  6. class Test1(models.Model):
  7. content = HTMLField()

迁移

  1. python manage.py makemigrations

生成表

  1. python manage.py migrate

 

表结构(longtext类型)

 

admin.py中完成注册

  1. from .models import *
  2. admin.site.register(Test1)

创建超级管理员,前面创建过(略)

在admin中可以看到(成功呈现)

实际上就是HTML

 

在视图中使用

views.py

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.conf import settings
  4. import os
  5. from .models import *
  6. from django.core.paginator import *
  7.  
  8. # Create your views here.
  9. # 富文本编辑器
  10. def htmlEditor(request):
  11. return render(request,'booktest/htmlEditor.html')
  12.  
  13. def htmlEditorHandle(request):
  14. html = request.POST['hcontent']
  15. # 找到id=1的值
  16. # test1 = Test1.objects.get(pk=1)
  17.  
  18. # 增加一条数据
  19. test1 = Test1()
  20. # 改写
  21. test1.content = html
  22. # 写进数据库
  23. test1.save()
  24. context = {'content':html}
  25. return render(request,'booktest/htmlShow.html',context=context)

  

urls.py

  1. url(r'^htmlEditor/$', views.htmlEditor),
  2. url(r'^htmlEditorHandle/$', views.htmlEditorHandle),

  

在静态文件中对应的JS文件

这个文件在安装目录的位置

htmlEditor.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>htmlEditor</title>
  7. <script type="text/javascript" src='/static/tiny_mce/tiny_mce.js'></script>
  8. <script type="text/javascript">
  9. {# 初始化,settings.py中设定的决定admin中的大小 #}
  10. tinyMCE.init({
  11. 'mode':'textareas',
  12. 'theme':'advanced',
  13. 'width':400,
  14. 'height':100
  15. });
  16. </script>
  17. </head>
  18. <body>
  19. <form method="post" action="/htmlEditorHandle/">
  20. {# csrf保护,加这个标签就行 #}
  21. {% csrf_token %}
  22. <input type="text" name="hname">
  23. <br>
  24. {# 富文本,替换这个textarea #}
  25. <textarea name='hcontent'>富文本编辑器在这</textarea>
  26. <br>
  27. <input type="submit" value="提交">
  28. </form>
  29. </body>
  30. </html>

htmlShow.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. {# 转义后的结果 #}
  10. {{ content|safe }}
  11. </body>
  12. </html>

  

效果:

提交

2 缓存

  短时间内不发生变化

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

设置缓存

  • 通过设置决定把数据缓存在哪里,是数据库中、文件系统还是在内存中
  • 通过setting文件的CACHES配置来实现
  • 参数TIMEOUT:缓存的默认过期时间,以秒为单位,这个参数默认是300秒,即5分钟;设置TIMEOUT为None表示永远不会过期,值设置成0造成缓存立即失效

缓存到本地

  1. CACHES={
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  4. 'TIMEOUT': 60,
  5. }
  6. }

  

缓存到redis,默认采用1数据库

安装包

  1. pip install django-redis-cache

  

启动redis数据库,切换数据库1

  1. C:\Users\123>redis-cli
  2. 127.0.0.1:6379> select 1
  3. OK
  4. 127.0.0.1:6379[1]> keys *
  5. (empty list or set)
  6. 127.0.0.1:6379[1]>

  

settings.py设定

  1. CACHES = {
  2. "default": {
  3. "BACKEND": "redis_cache.cache.RedisCache",
  4. "LOCATION": "localhost:6379",
  5. 'TIMEOUT': 60,
  6. },
  7. }

views.py

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.conf import settings
  4. import os
  5. from .models import *
  6. from django.core.paginator import *
  7.  
  8. # 缓存的包
  9. from django.views.decorators.cache import cache_page
  10. # Create your views here.
  11.  
  12. # 缓存60秒*15 = 15分钟
  13. @cache_page(60 * 15)
  14. def cache1(request):
  15. return HttpResponse('HELLO 1')

  

urls.py

  1. url(r'^cache1/$', views.cache1),

  

效果

数据库中效果(说明有东西缓存下来了)

  1. 127.0.0.1:6379[1]> keys *
  2. 1) ":1:views.decorators.cache.cache_page..GET.b8ae1c07a54f3e5305c8ec159f5ddea7.d41d8cd98f00b204e9800998ecf8427e.zh-Hans.Asia/Shanghai"
  3. 2) ":1:views.decorators.cache.cache_header..b8ae1c07a54f3e5305c8ec159f5ddea7.zh-Hans.Asia/Shanghai"
  4. 127.0.0.1:6379[1]> get :1:views.decorators.cache.cache_page..GET.b8ae1c07a54f3e5305c8ec159f5ddea7.d41d8cd98f00b204e9800998ecf8427e.zh-Hans.Asia/Shanghai
  5. "\x80\x04\x95x\x01\x00\x00\x00\x00\x00\x00\x8c\x14django.http.response\x94\x8c\x0cHttpResponse\x94\x93\x94)\x81\x94}\x94(\x8c\b_headers\x94}\x94(\x8c\x0ccontent-type\x94\x8c\x0cContent-Type\x94\x8c\x18text/html; charset=utf-8\x94\x86\x94\x8c\aexpires\x94\x8c\aExpires\x94\x8c\x1dThu, 09 May 2019 13:13:25 GMT\x94\x86\x94\x8c\rcache-control\x94\x8c\rCache-Control\x94\x8c\x0bmax-age=900\x94\x86\x94u\x8c\x11_closable_objects\x94]\x94\x8c\x0e_handler_class\x94N\x8c\acookies\x94\x8c\x0chttp.cookies\x94\x8c\x0cSimpleCookie\x94\x93\x94)\x81\x94\x8c\x06closed\x94\x89\x8c\x0e_reason_phrase\x94N\x8c\b_charset\x94N\x8c\n_container\x94]\x94C\aHELLO 1\x94aub."
  6. 127.0.0.1:6379[1]>

  

验证方法

修改views.py

  1. @cache_page(60 * 15)
  2. def cache1(request):
  3. return HttpResponse('HELLO 111') 

效果不变(缓存成功)---直接从缓存lim

  • 视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存

2.2缓存片段

views.py

  1. def cache1(request):
  2. # return HttpResponse('HELLO 111')
  3. return render(request,'booktest/cache1.html')

  

cache1.html

  1. {#加载模块#}
  2. {% load cache %}
  3.  
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta name="viewport" content="width=device-width, initial-scale=1">
  9. <title>Title</title>
  10. </head>
  11. <body>
  12. {# 缓存时间以秒为单位 #}
  13. {% cache 500 hello %}
  14. hello 2
  15. {% endcache %}
  16. </body>
  17. </html>

  

验证同上,这里就不验证了,方法1,看看redis数据库,方法2,修改缓存数据,看看视图会不会变

2.3 缓存值

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.conf import settings
  4. import os
  5. from .models import *
  6. from django.core.paginator import *
  7.  
  8. # 缓存的包
  9. from django.views.decorators.cache import cache_page
  10.  
  11. # 缓存数据导入的包
  12. from django.core.cache import cache
  13. # Create your views here.
  14.  
  15. # 缓存60秒*15 = 15分钟
  16. # @cache_page(60 * 15)
  17. def cache1(request):
  18. # return HttpResponse('HELLO 111')
  19. cache.set('key1','value1',600)
  20. context = cache.get('key1')
  21. context = {'key1':context}
  22. return render(request,'booktest/cache1.html',context=context)

cache1.html

  1. {#加载模块#}
  2. {% load cache %}
  3.  
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta name="viewport" content="width=device-width, initial-scale=1">
  9. <title>Title</title>
  10. </head>
  11. <body>
  12. {# 缓存时间以秒为单位 #}
  13. {% cache 500 hello %}
  14. hello 2
  15. <br>
  16. {{ key1 }}
  17. {% endcache %}
  18. </body>
  19. </html>

  缓存值的操作

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

 效果

3 全文检索

  2个难点:查询和分词

  分词高级:学习功能

  • haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架(与搜索引擎交互)
  • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用(不需要进行二进制通信)
  • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

安装三个依赖包

  1. pip install django-haystack
  2. pip install whoosh
  3. pip install jieba

  

在应用中添加

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'booktest',
  9. 'tinymce',
  10. 'haystack',
  11. ]

  

 

添加搜索引擎(在settings.py中添加)

  1. HAYSTACK_CONNECTIONS = {
  2. 'default': {
  3. # 默认搜索引擎
  4. 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
  5. # 路径+索引
  6. 'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
  7. }
  8. }
  9.  
  10. # 自动生成索引(应对增加修改删除)--作用:修改后自动更新索引
  11. HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

  

配置URL,在根级urls.py配置

  1. url(r'^search/', include('haystack.urls')),

 

应用目录下添加search_indexes.py文件

  1. # coding=utf-8
  2. from haystack import indexes
  3. from .models import Test1
  4.  
  5. class Test1InfoIndex(indexes.SearchIndex, indexes.Indexable):
  6. # 检索这种类型的对象
  7. text = indexes.CharField(document=True, use_template=True)
  8.  
  9. def get_model(self):
  10. # 得到表
  11. return Test1
  12.  
  13. def index_queryset(self, using=None):
  14. # 检索表中的哪些数据,在这里是全部数据
  15. return self.get_model().objects.all()

  

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

在这里是test1_text.txt(检索的字段)

  1. {{ object.content }}

  

  

结构如下

在search目录下,建立search.html文件,用于展现检索的结果

结构如下

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>检索结果</title>
  7. </head>
  8. <body>
  9. {% if query %}
  10. <h3>搜索结果如下:</h3>
  11. {# 传入 query和page对象#}
  12. {% for result in page.object_list %}
  13. {{ result.object.id }}
  14. <br>
  15.  
  16. {{ result.object.content|safe }}<br/>
  17. <hr>
  18. {% empty %}
  19. <p>啥也没找到</p>
  20. {% endfor %}
  21.  
  22. {% if page.has_previous or page.has_next %}
  23. <div>
  24. {% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« 上一页{% if page.has_previous %}</a>{% endif %}
  25. |
  26. {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一页 »{% if page.has_next %}</a>{% endif %}
  27. </div>
  28. {% endif %}
  29. {% endif %}
  30. </body>
  31. </html>

  

  

  

在haystack的安装目录下新键ChineseAnalyzer.py文件

所在位置

ChineseAnalyzer.py

  1. import jieba
  2. from whoosh.analysis import Tokenizer, Token
  3.  
  4. class ChineseTokenizer(Tokenizer):
  5. def __call__(self, value, positions=False, chars=False,
  6. keeporiginal=False, removestops=True,
  7. start_pos=0, start_char=0, mode='', **kwargs):
  8. t = Token(positions, chars, removestops=removestops, mode=mode,
  9. **kwargs)
  10. seglist = jieba.cut(value, cut_all=True)
  11. for w in seglist:
  12. t.original = t.text = w
  13. t.boost = 1.0
  14. if positions:
  15. t.pos = start_pos + value.find(w)
  16. if chars:
  17. t.startchar = start_char + value.find(w)
  18. t.endchar = start_char + value.find(w) + len(w)
  19. yield t
  20.  
  21. def ChineseAnalyzer():
  22. return ChineseTokenizer()

  

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

  1. from .ChineseAnalyzer import ChineseAnalyzer
  2. 查找
  3. analyzer=StemmingAnalyzer()
  4. 改为
  5. analyzer=ChineseAnalyzer()

 

生成索引

  1. python manage.py rebuild_index

  

会生成一个文件夹,结构如下

完成配置

在应用的urls.py中url

  1. url(r'^mysearch/$', views.mysearch),

views.py

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.conf import settings
  4. import os
  5. from .models import *
  6. from django.core.paginator import *
  7.  
  8. # 缓存的包
  9. from django.views.decorators.cache import cache_page
  10.  
  11. # 缓存数据导入的包
  12. from django.core.cache import cache
  13. # Create your views here.
  14. # 全文检索+中文分词
  15.  
  16. def mysearch(request):
  17. return render(request,'booktest/mysearch.html')

  

mysearch.py

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>mysearch</title>
  7. </head>
  8. <body>
  9. <form action="/search/" target="_blank" method="get">
  10. <input type="text" name="q">
  11. <input type="submit" value="查询">
  12.  
  13. </form>
  14. </body>
  15. </html>

  

查询结果

检索结果

  

4 celery(未完待续)

  开了一个新的进程处理耗时操作

  作用:处理耗时的(等待时间长的);处理定时的

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

安装

celery

  1. pip install celery==3.1.25

 

  1. pip install celery-with-redis==3.0

 

  1. pip install django-celery==3.1.17

  

把应用添加进去

  1. INSTALLED_APPS = (
  2. ...
  3. 'djcelery',
  4. } 

 

在settings.py中添加

  1. # 引入celery包
  2. import djcelery
  3.  
  4. djcelery.setup_loader()
  5. # redis数据库
  6. BROKER_URL = 'redis://127.0.0.1:6379/2'
  7. # 在哪个应用中使用
  8. CELERY_IMPORTS = ('booktest.task')

  

 

在应用下增加task.py文件(跟应用urls.py同级)---应用里面的任务

  1. import time
  2. from celery import task
  3.  
  4. @task
  5. def sayhello():
  6. print('hello ...')
  7. time.sleep(5)
  8. print('world ...')

  

迁移

  1. python manage.py migrate

  

启动redis---这里已经做成服务,自动启动了

启动worker

  1. python manage.py celery worker --loglevel=info

  

报错

  1. AttributeError: type object 'BaseCommand' has no attribute 'option_list'

  

找到base.py文件将第60行注释掉

路径

  1. # options = BaseCommand.option_list

  

还是报错

  1. AttributeError: type object 'CeleryCommand' has no attribute 'options'

  

版本不兼容,之后再去弄吧,先放在这

<Django> 第三方扩展的更多相关文章

  1. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  2. laravel中的自定义函数的加载和第三方扩展库加载

    l 1. 创建文件 app/Helpers/functions.php <?php // 示例函数 function foo() { return "foo"; } 2. 修 ...

  3. WeUI教程/第三方扩展及其他UI框架对比

    WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一.包含button.cell.dialog. progress. toa ...

  4. Django视图扩展类

    Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...

  5. django 高级扩展-中间件-上传图片-分页-富文本-celery

    """ django 高级扩展 一.静态文件 1.css,js,json,图片,字体等 2.配置setting,在最底下设置静态文件目录,写入下面代码 #配置静态文件目录 ...

  6. python第三方扩展库及不同类型的测试需安装相对应的第三方库总结

    如何安装第三方库 1.通过python的第三方仓库pypi中查找想要的第三方库 pypi地址:https://pypi.python.org/pypi pip是一个安装和管理Python包的工具,通过 ...

  7. Django中扩展Paginator实现分页

    Reference:https://my.oschina.net/kelvinfang/blog/134342 Django中已经实现了很多功能,基本上只要我们需要的功能,都能够找到相应的包.要在Dj ...

  8. Django组件扩展 总结

    1. Form组件扩展: 验证用户输入 obj = Form(reuest,POST,request.FILES) if obj.is_valid(): obj.clean_data else: ob ...

  9. [py]django第三方分页器django-pure-pagination实战

    第三方分页模块: django-pure-pagination 是基于django的pagination做的一款更好用的分页器 参考 配置django-pure-pagination模块 安装 pip ...

随机推荐

  1. ArrayList集合二

    集合的遍历 通过集合遍历,得到集合中每个元素,这是集合中最常见的操作.集合的遍历与数组的遍历很像,都是通过索引的方式,集合遍历方式如下 13 import java.util.ArrayList; 1 ...

  2. PHP ftp_rename() 函数

    定义和用法 ftp_rename() 函数重命名 FTP 服务器上的文件或目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_rename(ftp_connectio ...

  3. 限时免费 GoodSync 10 同步工具【转】

    一款不错的软件,正在开发本身的云盘,要是能够云执行任务就更好了! GoodSync 10是一种简单和可靠的文件备份和文件同步软件.它会自动分析.同步,并备份您的电子邮件.珍贵的家庭照片.联系人,.MP ...

  4. NX二次开发-通过点击按钮来控制显示工具条

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  5. Java-Class-C:org.springframework.http.HttpHeaders

    ylbtech-Java-Class-C:org.springframework.http.HttpHeaders 1.返回顶部 1.1. import org.springframework.htt ...

  6. 2019 牛客多校第一场 C Euclidean Distance ?

    题目链接:https://ac.nowcoder.com/acm/contest/881/C 题目大意 给定 m 和 n 个整数 ai,$-m \leq a_i \leq m$,求$\sum\limi ...

  7. MySQL基础管理

    1.用户管理 1.用户的作用: 登录:管理相对应的库表 2.定义 定义用户名和白名单 all@'10.0.0.%' 命名用户名时,最好不要太长,要和业务相关 白名单类型: user@'10.0.0.5 ...

  8. Bootstrap3的响应式缩略图幻灯轮播效果设计

    在线演示1 本地下载 HTML <div class="container">  <div class="col-md-12">  &l ...

  9. python脚本往redis加数据

    #-*-coding:utf-8-*-from rediscluster import StrictRedisClusterimport pymysqlimport timeimport cProfi ...

  10. ie8以下不兼容h5新标签的解决方法

    HTML5新添了一些语义化标签,他们能让代码语义化更直观易懂,有利于SEO优化.但是此HTML5新标签在IE6/IE7/IE8上并不能识别,需要进行JavaScript处理. 解决思路就是用js创建h ...