1. """
  2. django 高级扩展
  3.  
  4. 一、静态文件
  5. 1.css,js,json,图片,字体等
  6. 2.配置setting,在最底下设置静态文件目录,写入下面代码
  7. #配置静态文件目录
  8. STATIC_URL = '/static/'
  9. STATICFILES_DIRS = [
  10. os.path.join(BASE_DIR,'static')
  11. ]
  12. 3.在html中的调用方式
  13. 首在html开头先写:{% load static from staticfiles %} #如果STATIC_URL 改变html不用一个一个去改路径
  14. 举例
  15. {% load static from staticfiles %}
  16. <!DOCTYPE html>
  17. <html lang="en">
  18. <head>
  19. <meta charset="UTF-8">
  20. <title>Title</title>
  21. {# 这个是css调用 #}
  22. <link rel="stylesheet" type="text/css" href="{% static 'users/css/style.css' %}>
  23. {# 这个是js调用 #}
  24. {# <script type="text/javascript" src="/static/users/js/jquery-3.1.1.min.js"></script>#}
  25. <script type="text/javascript" src="/static/users/js/suck.js"></script>
  26. </head>
  27. <body>
  28. <h1>高级扩展程序</h1>
  29. <img src="/static/users/img/ceshi.jpg" />
  30. <hr>
  31. {#此种方式调用是配合开头,以防STATIC_URL路径变了#}
  32. <img src="{% static 'users/img/ceshi.jpg' %}" />
  33. </body>
  34. </html>
  35.  
  36. 二、中间件
  37. 概述:一个轻量级,底层的插件,可以介入django的请求与响应
  38. 本质:一个python
  39. 路径:在setting中的MIDDLEWARE = 里进行配置
  40. 方法:
  41. 1.__int__
  42. 不需要传参数,服务器响应第一个请求的时候自动调用,用于确定是否启用该中间件
  43. 2.process_request(self,request)
  44. 在执行视图之前被调用(分配url,匹配视图之前),每个请求上都会被调用,返回None或者HttpResponse对象
  45. 3.process_view(self,request,view_func,view_args,view_kwargs)
  46. 调用视图之前执行,每个请求上都会被调用,返回None或者HttpResponse对象
  47. 4.process_template_response(self,request,response)
  48. 在视图刚好执行完后被调用,每个请求上都会被调用,返回None或者HttpResponse对象
  49. 接下来再使用render
  50. 5.process_response(self,request,response)
  51. 所有响应返回浏览器之前调用,每个请求上都会被调用,返回HttpResponse对象
  52. 6.process_exception(self,request,exception)
  53. 当视图抛出异常时调用,返回HttpResponse对象
  54.  
  55. 三、自定义中间件
  56. 1.工程的目录先创建middleware目录,在里面创建users目录
  57. 2.创建一个python文件
  58. 3.举例
  59. from django.utils.deprecation import MiddlewareMixin
  60. class myMiddl(MiddlewareMixin):
  61. def process_request(self,request):
  62. print("get参数为:",request.GET.get('a'))
  63.  
  64. 四、使用自定义的中间件
  65. 1.配置setting文件,在MIDDLEWARE中添加 'middleware.users.myMiddl.myMiddl',
  66. 格式:app名.Py的文件名.py文件里的函数名
  67.  
  68. 五、上传图片
  69. 概述:文件上传的时候,文件数据存储在request.FILES属性中
  70. 注意:上传文件必须是post请求
  71. 注意:在html中的form表单上传文件需要加enctype="multipart/form-data",否则上传不上去
  72. 例:
  73. <form method="post" action="/savefile/" enctype="multipart/form-data">
  74. <input type="file" name="file">
  75. <input type="submit" value="上传">
  76. </form>
  77. 存储路径:在static目录下创建upfile目录用于存储上传的文件
  78. 配置setting文件:
  79. # 上传文件目录(注意在'static\upfile'中liux用/此斜杠,windwos用\反斜杠)
  80. MDEIA_ROOT=os.path.join(BASE_DIR,r'static\upfile')
  81.  
  82. 代码示例
  83. HTML的示例
  84. <body>
  85. <form method="post" action="/savefile/" enctype="multipart/form-data">
  86. {% csrf_token %}
  87. <input type="file" name="file">
  88. <input type="submit" value="上传">
  89. </form>
  90. </body>
  91. VIEWS的示例
  92. def upfile(request):
  93. return render(request,'users/upfile.html')
  94. import os
  95. from django.conf import settings
  96. def savefile(request):
  97. if request.method == 'POST':
  98. f = request.FILES['file']
  99. #合成文件在服务器端路径
  100. filePath = os.path.join(settings.MDEIA_ROOT,f.name)
  101. with open(filePath,'wb') as fp:
  102. for info in f.chunks():
  103. fp.write(info)
  104. return HttpResponse('ok')
  105. else:
  106. return HttpResponse('上传失败')
  107.  
  108. 六、分页
  109. 1.Paginator对象
  110. 创建对象:
  111. 格式 Paginator(列表,整数)
  112. 返回值 返回分页对像
  113. 属性:
  114. count 对象总数
  115. num_pages 页面总数
  116. page_range 页码列表 [1,2,3,4,5] 页码从1开始
  117. 方法:
  118. page(num) 获得一个page对象,如果提供的页码不存在会抛出'invalidpage'
  119. 异常:
  120. 一、invalidpage 当向page()传递的是一个无效的页码时输出
  121. 二、PageNotAnInteger 当向page()传递的不是一个整数时输出
  122. 三、EmptyPage 当向page()传递一个有效值,但是该页面时没有数据输出
  123.  
  124. 2.Page对象
  125. 创建对象:Paginator对象的page()方法返回得到page对象,不需要手动创建
  126. 属性:
  127. object_list 当前页面上所有数据对象列表
  128. number 当前页的页码值
  129. paginator 当前page对象关联的paginator对象
  130.  
  131. 方法:
  132. has_next() 判断是否有下一页,如果有返回True
  133. has_previous() 判断是否有上一页,如果有返回True
  134. has_other_pages() 判断是否有上一页或下一页,如果有返回True
  135. next_page_number() 返回下一页的页码,如果下一页不存在,抛出invalidpage异常
  136. previous_page_number() 返回上一页的页码,如果下一页不存在,抛出invalidpage异常
  137. len() 返回当前页的数据(对象)个数
  138.  
  139. Paginator对象与Page对象
  140. 代码示例:
  141. 1.配置url
  142. url(r'^studentpage/(\d+)/$',views.studentpage),
  143. 2.配置view
  144. from .models import Students
  145. from django.core.paginator import Paginator
  146. def studentpage(request,pageid):
  147. alllist=Students.objects.all()
  148. #这个是每页分成3个
  149. paginator = Paginator(alllist,3)
  150. #这个是每次拿1页
  151. pagelist = paginator.page(pageid)
  152. return render(request,'users/studentpage.html',{'students':pagelist})
  153. 3.配置html
  154. <body>
  155. <ul>
  156. {% for stu in students %}
  157. <li>
  158. {{ stu.sname }}--{{ stu.sgrade }}
  159. </li>
  160. {% endfor %}
  161. </ul>
  162. <ul>
  163. {% for index in students.paginator.page_range %}
  164. {#这边是判断当前页码是否相等,如果相等就不能点击自己的当前#}
  165. {% if index == students.number %}
  166. <li>
  167. {{ index }}
  168. </li>
  169. {% else %}
  170. <li>
  171. <a href="/studentpage/{{ index }}/">{{ index }}</a>
  172. </li>
  173. {% endif %}
  174. {% endfor %}
  175. </ul>
  176. </body>
  177.  
  178. 七、ajax 需要动态生成,请求json数据
  179.  
  180. 八、富文本
  181. 安装
  182. pip install django-tinymce
  183. 在站中使用(注意:要确定主url中是否开启: path('admin/', admin.site.urls), 否则无法建超级管理员
  184. 1.配置setting文件INSTALLED_APPS里添加 'tinymce'
  185. 2.并在setting文件最底下添加如下:
  186. #富文本
  187. TINYMCE_DEFAULT_CONFIG = {
  188. 'theme':'advanced',
  189. 'width':600,
  190. 'height':400,
  191. }
  192. 3.models创建一个模型类,并进行牵移,python manage.py makemigrations python manage.py migrate
  193. from tinymce.models import HTMLField
  194. class Text(models.Model):
  195. str = HTMLField()
  196. 4.在工程里的admin.py中配置站点:
  197. from .models import Text
  198. admin.site.register(Text)
  199. 5.创建超级管理员并设置账号和密码
  200. python manage.py createsuperuser
  201. 6.登陆并点击text就可以进行编辑
  202. http://127.0.0.1:8000/admin
  203.  
  204. 在定义视图中使用
  205. 示例:
  206. <!DOCTYPE html>
  207. <html lang="en">
  208. <head>
  209. <meta charset="UTF-8">
  210. <title>富文本</title>
  211. {# 不管路径有没有,直接按下写,引入 #}
  212. <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
  213. <script type="text/javascript">
  214. tinyMCE.init({
  215. 'mode':'textareas',
  216. 'theme':'advanced',
  217. 'width':800,
  218. 'height':600,
  219. })
  220. </script>
  221. </head>
  222. <body>
  223. <form action="/editsave/" method="post">
  224. <textarea name="str">suck is good man</textarea>
  225. <input type="submit" value="提交">
  226. </form>
  227. </body>
  228. </html>
  229.  
  230. celery
  231. 文档网址:http://docs.jinkan.org/docs/celery/
  232. 1.用户发起request,并且要等待response返回,但是在视图中有一些耗时的操作,导致用户可能会很久才接收到response,
  233. 2.网站每一段时间要同步一次数据,但是html请求是需要触发,
  234. 解决:
  235. 1.celery来解决,将耗时的操作放到celery中执行
  236. 2.使用celery定时来执行
  237.  
  238. celery
  239. 任务:task 本质是一个python函数,将耗时操作封闭成一个函数
  240. 队列:queue 将要执行的任务放队列里
  241. 工人:worker 负责执行对列中的任务
  242. 代理:broker 负责调度,在部署环境中使用redis
  243. 安装:一共安装三个
  244. pip install celery
  245. pip install celery-with-redis
  246. pip install django-celery
  247. 配置setting
  248. 1.INSTALLED_APPS添加 'djcelery',
  249. 并在setting最底下创建如下:
  250. #celery
  251. import djcelery
  252. djcelery.setup_loader() #初始化队列
  253. BROKER_URL='redis://weilai@127.0.0.1:6379/0'
  254. CELERY_IMPORTS = ('users.task')
  255.  
  256. 2.在应用的(users)目录下创建task文件
  257. 3.迁移(执行python manage.py migrate,不需要生成迁移文件,直接执行此句)生成celery需要的数据库
  258. 4.在工程目录下的xinqidain里创建celery.py,并放下下面代码:
  259. from __future__ import absolute_import
  260. import os
  261. from celery import Celery
  262. from django.conf import settings
  263. os.environ.setdefault('DJANGO_SETTINGS_MODULE','whthas_home.settings')
  264. app = Celery('portal')
  265. app.config_from_object('django.conf:settings')
  266. app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)
  267.  
  268. @app.task(bind=True)
  269. def debug_task(self):
  270. print('Request:{0!r}'.format(self.request))
  271. 5.在工程目录下的xinqidain的目录的__inin__.py添加以下句子
  272. from .celery import app as celery_app
  273.  
  274. """

  

django 高级扩展-中间件-上传图片-分页-富文本-celery的更多相关文章

  1. django入门8之xadmin引入富文本和excel插件

    django入门8之xadmin引入富文本和excel插件 Xadmin引入富文本 插件的文档 https://xadmin.readthedocs.io/en/docs-chinese/make_p ...

  2. [Django高级之中间件、csrf跨站请求伪造]

    [Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...

  3. Django中扩展Paginator实现分页

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

  4. django - 替换admin的textarea为 富文本

    1. 安装这个:https://github.com/pydanny/django-wysiwyg 2. 下载你希望的 编辑器,到你的指定路径STATIC_ROOT [详细后面补充]

  5. Django配置富文本编辑器kindeditor

    一.简介 django是一个容易快速上手的web框架,用它来创建内容驱动型的网站(比如独立博客)十分方便.遗憾的是,django并没有提供官方的富文本编辑器,而后者恰好是内容型网站后台管理中不可或缺的 ...

  6. Django高级部分

    Django高级部分 1.上传图片: 当Django在处理文件上传的时候,文件数据被保存在request.FILES,FILES中的每个键为<input type="file" ...

  7. PHP接入umeditor(百度富文本编辑器)

    2015年6月28日 23:08:49 星期日 效果: 开搞;) 首先: 百度官网上下载 umeditor 简版的富文本编辑器(这里) 然后: 解压放到自己的项目中, 配置服务器, 保证能在浏览器端加 ...

  8. Django (八) 中间件&验证码&富文本&缓存

    中间件&验证码&富文本&缓存 1. 中间件&AOP   中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程) ​ 中间件的本质就是一 ...

  9. django——文件上传_分页_ajax_富文本_celery

    上传文件 概述 当Django在处理文件上传时,文件的数据被存储在request.FILES属性中 FILES只有在请求的方法为POST且提交的form表单带有enctype="multip ...

随机推荐

  1. 题解 Merchant

    传送门 可以发现如果我们最终选择的物品集合已经确定,就很好求了 \(\sum k*t+\sum b \geqslant s\) ,二分即可 但现在我们无法确定该选哪些物品 因此我们只需要check一下 ...

  2. 题解 biology

    传送门 赛时靠spfa求最长路骗了30pts spfa的时间复杂度是\(O(k|E|)\),不是\(O(k|N|)\)! dijkstra 时间复杂度\(O((n+m)logn)\) 特别注意这两个的 ...

  3. 【Paper】智能家居

    From: http://liudongdong1.github.io keyword: Human-centered computing , LoRa Paper: WIDESEE WIDESEE: ...

  4. Spring-Boot注入自定义properties文件配置

    创建wzq.properties wzq.properties注入User实体类中 @PropertySource(value = "classpath:wzq.properties&quo ...

  5. docker 安装部署 jenkins

    cd /data/docker-data/jenkins mkdir jenkins_home chmod 777 jenkins_home docker run -d -p 10240:8080 - ...

  6. Java常用类之字符串类

    String 的特性 public final class String implements java.io.Serializable, Comparable<String>, Char ...

  7. C++11 shared_ptr智能指针(超级详细)

    在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃.程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的.比如: 有些内存资源已经被释放,但指向它的指针并没 ...

  8. SpringBoot中的thymeleaf引擎报错

    关于:thymeleaf报错: An error happened during template parsing (template: "class path resource [temp ...

  9. ffmpeg 常用知识点收集

    ffmpeg 常用知识点收集 一.基础简介 FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及l ...

  10. input text 只能输入数字 js 正则表达式

    $("#txt1").keyup(function () { $(this).val($(this).val().replace(/[^0-9.]/g, '')); }).bind ...