1. Django 千锋培训读书笔记
  2. https://www.bilibili.com/video/av17879644/?p=1
  3.  
  4. 切换到创建项目的目录 cd C:\Users\admin\Desktop\DjangoProject
  5. 创建名为project的项目命令 django-admin startproject project
  6. 注:所有路径不要有中文
  7. 切换到目录cd C:\Users\admin\Desktop\DjangoProject\project
  8. 目录层级说明:manage.py 一个命令行工具,可以让我们用多种方式对Django项目进行交互
  9. __init__.py 一个空文件,它告诉Python这个目录应该被看做一个包
  10. settings.py 项目的配置文件(主要处理文件)
  11. urls.py 项目的url声明 (主要处理文件)
  12. wsgi.py 项目与WSGI兼容的Web服务器入口
  13. 配置数据库 Django默认使用SQLite数据库
  14. settings.py文件中通过DATABASES选项进行数据库配置
  15. 配置MySQL Python3.x中安装的是PyMySQL
  16. __init__.py文件中写入两行代码import pymysql
  17. pymysql.install_as_MySQLdb()
  18. 以数据库sunck为例进行示范:对settings.py中的DATABASES进行设置
  19. DATABASES = {
  20. 'default': {
  21. 'ENGINE': 'django.db.backends.mysql',
  22. 'NAME': "sunck",
  23. 'USER': "root",
  24. 'PASSWORD': "admin123",
  25. 'HOST': "localhost",
  26. 'PORT': ""
  27. }
  28. }
  29. 创建应用--在一个项目中可以创建多个应用,每个应用进行一种业务处理
  30. 打开CMD,进入project(目录名)的目录下,输入命令创建名为myAppapp:
  31. python manage.py startapp myAPP
  32. myAPP目录说明
  33. admin.py 进行站点配置
  34. models.py 创建模型
  35. views.py 创建视图
  36. 激活应用 settings.py文件中,将myApp应用加入到INSTALLED_APPS选项中
  37. INSTALLED_APPS = [
  38. 'django.contrib.admin',
  39. 'django.contrib.auth',
  40. 'django.contrib.contenttypes',
  41. 'django.contrib.sessions',
  42. 'django.contrib.messages',
  43. 'django.contrib.staticfiles',
  44. 'myApp',
  45. ]
  46. 定义模型 概述:有一个数据表就对应有一个模型
  47. models.py文件中定义模型
  48. 引入:from django.db import models
  49. 模型类要继承models.Model
  50. 示例:
  51. class Grades(models.Model):
  52. gname = models.CharField(max_length=20)
  53. gdate = models.DateTimeField()
  54. ggirlnum = models.IntegerField()
  55. gboynum = models.IntegerField()
  56. isDelete = models.BooleanField(default=False)
  57.  
  58. class Students(models.Model):
  59. sname = models.CharField(max_length=20)
  60. sgender = models.BooleanField(default=True)
  61. sage = models.IntegerField()
  62. scontend = models.CharField(max_length=20)
  63. isDelete = models.BooleanField(default=False)
  64. sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,)
  65. 说明:
  66. 不需要定义主键,在生成时自动添加,并且值为自动增加
  67. 在数据库中生成数据表
  68. 生成迁移文件
  69. 执行 python manage.py makemigrations migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表
  70. 执行迁移
  71. 执行 python manage.py migrate 相当于执行MySQL语句创建了数据表
  72.  
  73. 测试数据操作
  74. 进入到python shell
  75. 执行 python manage.py shell
  76. 引入包
  77. from myApp.models import Grades, Students
  78. from django.utils import timezone
  79. from datetime import *
  80. 查询所有数据
  81. 类名.objects.all()
  82. 示例: Grades.objects.all()
  83. 添加数据
  84. 本质:创建一个模型类的对象实例
  85. 示例:CMD窗口下:
  86. grade1 = Grades()
  87. grade1.gname = "python04"
  88. grade1.gdate = datetime(year=2017, month=7, day=17)
  89. grade1.ggirlnum = 3
  90. grade1.gboynum = 70
  91. grade1.save()
  92. 查看某个对象
  93. 类名.objects(pk=索引号)
  94. 示例:
  95. Grades.objects.get(pk=2)
  96. Grades.objects.all()
  97. 修改某个数据
  98. 模型对象属性 = 新值
  99. 示例:
  100. grade2.gboynum = 60
  101. grade2.save()
  102. 删除数据
  103. 模型对象.delete()
  104. grade2.delete()
  105. 注意:这是物理删除,数据库中的相应数据被永久删除
  106. 关联对象
  107. 示例:
  108. stu = Students()
  109. stu.sname = "Xue Yanmei"
  110. stu.sgender = False
  111. stu.sage = 20
  112. stu.scontend = "I am Xue Yanmei"
  113. stu.sgrade = grade1
  114. stu.save()
  115. 获得关联对象的集合
  116. 需求:猎取python04班级的所有学生
  117. 对象名.关联的类名小写_set.all()
  118. 示例:grade1.students_set.all()
  119. 需求:创建曾志伟,属于python04班级
  120. 示例:
  121. stu3 = grade1.students_set.create(sname=u'Zhen Zhiwei',sgender=True,scontend=u"I am Zhen Zhiwei",sage=45)
  122. 注意:这样创建的数据直接被添加到了数据库当中。
  123. 启动服务器:
  124. 格式:python manage.py runserver ip:port
  125. 注意:ip可以不写,不写代表本机ip
  126. 端口号默认是8000
  127. python manage.py runserver
  128. 说明:
  129. 这是一个纯python编写的轻量级web服务器,仅仅在开发测试中使用这个
  130. Admin站点管理:
  131. 概述:
  132. 内容发布:负责添加,修改,删除内容的
  133. 公告访问
  134. 配置Admin应用:
  135. settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',
  136. 这条默认是添加好的。
  137. 创建管理员用户:
  138. 在项目目录下执行 python manage.py createsuperuser
  139. 依次输入账号名,邮箱,密码即可完成用户创建
  140. 登陆:
  141. http://127.0.0.1:8000/admin/
  142. 汉化:
  143. project\settings.py
  144. 中作如下设定:LANGUAGE_CODE = 'zh-Hans'
  145. TIME_ZONE = 'Asia/Shanghai'
  146. 管理数据表:
  147. 修改 myAPP\admin.py 如下:
  148. from django.contrib import admin
  149. # Register your models here.
  150. from .models import Grades, Students
  151. # 注册
  152. admin.site.register(Grades)
  153. admin.site.register(Students)
  154. 自定义管理页面:
  155. 属性说明
  156. # 列表页属性
  157. list_display = [] # 显示字段设置
  158. list_filter = [] # 过滤字段设置
  159. search_fields = [] # 搜索字段设置
  160. list_per_page = [] # 分页设置
  161. # 添加,修改页属性
  162. fields = [] # 规定属性的先后顺序
  163. fieldsets = [] # 给属性分组 注意:fields与fieldsets不能同时使用
  164. 属性示例:
  165. # 列表页属性
  166. list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
  167. list_filter = ['gname']
  168. search_fields = ['gname']
  169. list_per_page = 5
  170. # 添加,修改页属性
  171. # fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
  172. fieldsets = [
  173. ("num",{"fields":['ggirlnum', 'gboynum']}),
  174. ("base", {"fields":["gname", "gdate", "isDelete"]}),
  175. ]
  176. 关联对象:需求:在创建一个班级时可以直接添加几个学生
  177. class StudentsInfo(admin.TabularInline):# 可选参数admin.StackedInline
  178. model = Students
  179. extra = 2
  180. class GradesAdmin(admin.ModelAdmin):
  181. inlines = [StudentsInfo]
  182. 布尔值显示问题示例:
  183. class StudentsAdmin(admin.ModelAdmin):
  184. def gender(self):
  185. if self.sgender:
  186. return "男"
  187. else:
  188. return "女"
  189. # 设置页面列的名称
  190. gender.short_description = "性别"
  191. list_display = ['pk', 'sname', 'sage', gender,
  192. 'scontend', 'sgrade', 'isDelete']
  193. list_per_page = 10
  194. admin.site.register(Students, StudentsAdmin)
  195. 执行按钮位置:
  196. class StudentsAdmin(admin.ModelAdmin):
  197. ...snip...
  198. actions_on_top = False
  199. actions_on_bottom = True
  200. admin.site.register(Students, StudentsAdmin)
  201. 使用装饰器完成注册:
  202. @admin.register(Students)
  203. class StudentsAdmin(admin.ModelAdmin):
  204. def gender(self):
  205. ...snip...
  206. actions_on_top = False
  207. actions_on_bottom = True
  208. 视图的基本使用
  209. 概述:
  210. Django中,视图是对web请求进行回应
  211. 视图就是一个python函数,在views.py文件中定义。
  212. 定义视图:
  213. 示例:在myApp\views.py中写入
  214. from django.shortcuts import render
  215. # Create your views here.
  216. from django.http import HttpResponse
  217. def index(request):
  218. return HttpResponse("Sunck is a good man")
  219. 配置url:方法一:path方法:
  220. 修改project目录下的urls.py文件:
  221. from django.contrib import admin
  222. from django.urls import path, include
  223. urlpatterns = [
  224. path('admin/', admin.site.urls),
  225. path('', include('myApp.urls')),
  226. ]
  227. myApp应用目录下创建urls.py文件:
  228. from django.urls import path, include
  229. from . import views
  230. urlpatterns = [
  231. path('',views.index),
  232. ]
  233. 配置url:方法二:url方法:
  234. 修改project目录下的urls.py文件:
  235. from django.contrib import admin
  236. from django.conf.urls import url,include
  237. urlpatterns = [
  238. url(r'^admin/', admin.site.urls),
  239. url(r'^', include('myApp.urls')),
  240. ]
  241. myApp应用目录下创建urls.py文件:
  242. from django.conf.urls import url
  243. from . import views
  244. urlpatterns = [
  245. url(r'^$', views.index),
  246. ]
  247. 模板的基本使用:
  248. 概述:模板是HTML页面,可以根据视图中传递过来的数据进行填充
  249. 创建模板:
  250. 创建templates目录,在目录下创建对应项目的模板目录(project/templates/myApp
  251. 配置模板路径:
  252. 修改settings.py文件下的TEMPLATES下的'DIRS''DIRS': [os.path.join(BASE_DIR, 'templates')],
  253. 定义grades.htmlstudents.html模板:
  254. templates\myApp\目录下创建grades.htmlstudents.html模板文件
  255. 模板语法:
  256. {{输出值,可以是变量,也可以是对象,属性}}
  257. {%执行代码段%}
  258. http://127.0.0.1:8000/grades
  259. grades.html模板:
  260. <!doctype html>
  261. <html lang="en">
  262. <head>
  263. <meta charset="UTF-8">
  264. <meta name="viewport"
  265. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  266. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  267. <title>班级信息</title>
  268. </head>
  269. <body>
  270. <h1>班级信息列表</h1>
  271. <ul>
  272. <!--[python04, python05, python06]-->
  273. {%for grade in grades%}
  274. <li>
  275. <a href="#">{{grade.gname}}</a>
  276. </li>
  277. {%endfor%}
  278. </ul>
  279. </body>
  280. </html>
  281. 定义视图:myApp\views.py
  282. from .models import Grades
  283. def grades(request):
  284. # 去模板里取数据
  285. gradesList = Grades.objects.all()
  286. # 将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器
  287. return render(request, 'myApp/grades.html', {"grades": gradesList})
  288. 配置url:myApp\urls.py
  289. urlpatterns = [
  290. url(r'^$', views.index),
  291. url(r'^(\d+)/(\d+)$', views.detail),
  292. url(r'^grades/', views.grades)
  293. ]
  294. http://127.0.0.1:8000/students
  295. students.html模板
  296. <!doctype html>
  297. <html lang="en">
  298. <head>
  299. <meta charset="UTF-8">
  300. <meta name="viewport"
  301. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  302. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  303. <title>学生页面</title>
  304. </head>
  305. <body>
  306. <h1>学生信息列表</h1>
  307. <ul>
  308. {%for student in students%}
  309. <li>
  310. {{student.sname}}--{{student.scontend}}
  311. </li>
  312. {%endfor%}
  313. </ul>
  314. </body>
  315. </html>
  316. 定义视图:myApp\views.py
  317. from .models import Students
  318. def students(request):
  319. studentsList = Students.objects.all()
  320. return render(request, 'myApp/students.html', {"students": studentsList})
  321. 配置url:myApp\urls.py
  322. urlpatterns = [
  323. url(r'^$', views.index),
  324. url(r'^(\d+)/(\d+)$', views.detail),
  325. url(r'^grades/', views.grades),
  326. url(r'^students/', views.students),
  327. ]
  328. 需求:点击班级,显示对应班级的学生名字
  329. 运行不正常https://www.bilibili.com/video/av17879644/?p=12
  330.  
  331. Django流程梳理
  332. 创建工程:执行 django-admin startproject 工程名
  333. 创建项目:执行 python manage.py startapp 项目名称
  334. 激活项目:修改 settings.py中的INSTALLED_APPS
  335. 配置数据库:
  336. 修改__init__.py文件
  337. 修改settings.py文件中的DATABASES
  338. 创建模型类:在项目目录下的models.py文件中创建
  339. 生成迁移文件:执行python manage.py makemigrations
  340. 执行迁移:执行python manage.py migrate
  341. 配置站点:略
  342. 创建模板目录/项目模板目录
  343. settings.py中的TEMPLATES添加templates路径
  344. 在工程目录下(project)修改urls.py
  345. 在项目目录下创建urls.py
  346.  
  347. 使用他人Django代码需要的简易修改:
  348. 1.settings.py中修改数据库名
  349. 2.settings.py中修改数据库密码
  350. 3.删除由内向外文件(在对应目录里鼠标右键删除)
  351. 4.在数据库中创建对应第一步的数据库(自己在SQL中创建)
  352. 5.执行生成迁移文件
  353. 6.执行迁移
  354. 7.启动服务
  355. 8.浏览器测试
  356.  
  357. Django模型
  358. Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API
  359. 我们可以根据不同的业务需求选择不同的数据库。
  360. 配置数据库
  361. 修改工程目录下的__init__.py文件
  362. import pymysql
  363. pymysql.install_ad_MySQLdb()
  364. 修改settings.py文件中的DATABASES
  365. 开发流程
  366. 配置数据库
  367. 定义模型类:一个模型都在数据库中对应一张数据库表
  368. 生成迁移文件
  369. 执行迁移生成数据表
  370. 使用模型类进行增删改查
  371. ORM
  372. 概述:对象-关系-映射
  373. 任务:
  374. 根据对象的类型生成表结构
  375. 将对象,列表的操作转换成SQL语句
  376. SQL语句查询到的结果转换为对象,列表
  377. 优点:
  378. 极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码的问题
  379. 定义模型
  380. 模型,属性,表,字段之间的关系
  381. 一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段
  382. 定义属性:见下文
  383. 创建模型类
  384. 元选项
  385. 在模型类中定义Meta类,用于设置元信息
  386. 示例:
  387. class Meta:
  388. db_table = "students"
  389. ordering = ['id']
  390. db_table
  391. 定义数据表名,推荐用小写字母,数据表名默认为项目名小写_类名小写
  392. ordering
  393. 对象的默认排序字段,获取对象的列表时使用
  394. 示例:
  395. ordering['id'] id按升序排列
  396. ordering['-id'] id按降序排列
  397. 注意:排序会增加数据库开销
  398. 模型成员
  399. 类属性
  400. 隐藏类属性objects
  401. Manager类型的一个对象,作用是与数据库进行交互
  402. 当定义模型类时没有指定管理器,则Django为模型创建一个名为objects的管理器
  403. 自定义管理器示例:
  404. 定义stuObj管理器:
  405. stuObj = models.Manager()
  406. 当为模型指定模型管理器,Django就不再为模型类生成objects模型管理器了。
  407. 自定义管理器Manager
  408. 模型管理器是Django的模型进行与数据库交互的窗口,一个模型可以有多个模型管理器
  409. 作用:
  410. 向管理器类中添加额外的方法
  411. 修改管理器返回的原始查询集
  412. 通常会重写get_queryset()方法
  413. 代码示例:
  414. class StudentsManager(models.Manager):
  415. def get_queryset(self):
  416. return super(StudentsManger, self).get_queryset().filter(isDelete=False)
  417.  
  418. class Students(model.Moder):
  419. # 自定义模型管理器
  420. # 当自定义模型管理器,objects就不存在了
  421. stuObj = models.Manger()
  422. stuObj2 = StudentsManager()
  423.  
  424. 创建对象
  425. 目的:向数据库中添加数据
  426. 当创建对象时,django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存在数据库表中。
  427. 注意:
  428. __init__方法已经在父类models.Model中使用,在自定义的模型中无法使用。
  429. 方法:
  430. 在模型类中增加一个类方法,示例如下:
  431. class Students(model.Moder):
  432. ...snip...
  433. @classmethod
  434. def createStudent(cls, name, age, gender, contend,
  435. grade,lastT, createT, isD=False):
  436. stu = cls(sname=name, sage=age, sgender=gender,
  437. scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT,
  438. isDelete=isD)
  439. return stu
  440. 在自定义管理器中添加一个方法,示例如下:
  441. class StudentsManager(models.Manager):
  442. def get_queryset(self):
  443. return super(StudentsManager, self).get_queryset().filter(isDelete=False)
  444. def createStudent(self, name, age, gender, contend, grade, lastT, createT, isD=False):
  445. stu = self.model()
  446. # print(type(grade))
  447. stu.sname = name
  448. stu.sage = age
  449. stu.sgender = gender
  450. stu.scontend = contend
  451. stu.sgrade = grade
  452. stu.lastTime = lastT
  453. stu.createTime = createT
  454. return stu
  455. 模型查询
  456. 概述
  457. 查询集表示从数据库获取的对象的集合
  458. 查询集可以有多个过滤器
  459. 过滤器就是一个函数,基于所给的参数限制查询集结果
  460. SQL角度来说,查询集和select语句等价,过滤器就像where条件
  461. 查询集
  462. 在管理器上调用过滤器方法返回查询集
  463. 查询集经过过滤器筛选后返回新的查询集,所以可以写成链式调用
  464. 惰性执行
  465. 创建查询集不会带来任何数据库的访问,直到调用数据库时,才会访问数据
  466. 直接访问数据的情况:
  467. 迭代
  468. 序列化
  469. if合用
  470. 返回查询集的方法称为过滤器
  471. all():返回查询集中的所有数据
  472. filter():保留符合条件的数据
  473. filter(键=值)
  474. filter(键=值,键=值)
  475. filter(键=值).filter(键=值) 且的关系
  476. exclude():过滤掉符合条件的
  477. order_by():排序
  478. values():一条数据就是一个字典,返回一个列表
  479. get()
  480. 返回一个满足条件的对象
  481. 注意:
  482. 如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常
  483. 如果找到多个对象,会引发模型类MultipleObjectsReturned异常
  484. count():返回查询集中对象的个数
  485. first():返回查询集中第一个对象
  486. last():返回查询集中最后一个对象
  487. exits():判断查询集中是否有数据,如果有数据返回 True,否则返回 False.
  488. 限制查询集
  489. 查询集返回列表,可以使用下标的方法进行限制,等同于sql中的limit语句
  490. 注意:下标不能是负数
  491. 示例:studentsList = Students.stuObj2.all()[0:5]
  492. 查询集的缓存
  493. 概述:
  494. 每个查询集都包含一个缓存,来最小化对数据库的访问
  495. 在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结果。
  496. 以后的查询直接使用查询集的缓存
  497. 字段查询
  498. 概述
  499. 实现了sql中的where语句,作为方法filter(),exclude(),get()的参数
  500. 语法:属性名称__比较运算符=值
  501. 外键:属性名称_id
  502. 转义:类似sql中的like语句
  503. like有关情况看我哥他%是为了匹配点位,匹配数据中的%使用(where like "\%"
  504. filter(sname__contains="%")
  505. 比较运算符
  506. exact:判断,大小写敏感
  507. filter(isDelete=False)
  508. contains:是否包含,大小写敏感
  509. studentsList = Students.stuObj2.filter(sname__contains="孙")
  510. startswith,endswith:以value开头或结尾,大小写敏感
  511. 以上四个在前面加上i,就表示不区分大小写iexact,icontains,istartswith,iendswith
  512. isnull,isnotnull
  513. 是否为空
  514. filter(sname__isnull=False)
  515. in:是否包含在范围内
  516. gt大于,gte大于等于,lt小于,lte小于等于
  517. year,month,day,week_day,hour,minute,second
  518. studentsList = Students.stuObj2.filter(lastTime__year=2017)
  519. 跨关联查询
  520. 处理join查询
  521. 语法:
  522. 模型类名__属性名__比较运算符
  523. # 描述中带有‘薛延美’这三个字的数据是属于哪个班级的
  524. grade = Grades.objects.filter(students__scontend__contains='薛延美')
  525. print(grade)
  526. 查询快捷pk代表的主键
  527. 聚合函数
  528. 使用aggregate函数返回聚合函数的值
  529. Avg
  530. Count
  531. Max
  532. maxAge = Student.stuObj2.aggregate(Max('sage'))
  533. maxAge为最大的sage
  534. Min
  535. Sum
  536. F对象
  537. 可以使用模型的A属性与B属性进行比较
  538. from django.db.models import F,Q
  539. def grades1(request):
  540. g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
  541. print(g)
  542. # [<Grades: python02>,<Grades: python03>]
  543. return HttpResponse("OOOOOOOo")
  544. 支持F对象的算术运算
  545. g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
  546. Q对象
  547. 概述:过滤器的方法的关键字参数,条件为And模式
  548. 需求:进行or查询
  549. 解决:使用Q对象
  550. def students4(request):
  551. studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))
  552. return render(request, 'myApp/students.html', {"students": studentsList})
  553. 只有一个Q对象的时候,就是用于正常匹配条件
  554. studentsList = Students.stuObj2.filter(~Q(pk__lte=3))
  555. ~Q是取反
  556.  
  557. 定义属性
  558. 概述:
  559. django根据属性的类型确定以下信息
  560. 当前选择的数据库支持字段的类型
  561. 渲染管理表单时使用的默认html控件
  562. 在管理站点最低限度的验证
  563.  
  564. django会为表增加自动增长的主键列,每个模型只能有一个主键列,如
  565. 果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
  566.  
  567. 属性命名限制
  568. 遵循标识符规则,且变量不能与Python保留字相同
  569. 由于django的查询方式,不允许使用连续的下划线
  570.  

  571. 定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,
  572. 为了方便使用,被导入到django.db.models
  573.  
  574. 使用方式
  575. 导入: from django.db import models
  576. 通过 models.Field创建字段类型的对象,赋值给属性
  577.  
  578. 逻辑删除
  579. 对于重要类型都做逻辑删除,不做物理删除,实现方法是定义idDelete属性,
  580. 类型为BooleanField,默认值为False
  581.  
  582. 字段类型
  583. autoField
  584. 一个根据实际ID自动增长的IntegerField,通常不指定,
  585. 如果不指定,一个主键字段将自动添加到模型中
  586.  
  587. CharField(max_length=字符长度)
  588. 字符串,默认的表彰样式是TextInput
  589.  
  590. TextField
  591. 大文本字段,一般超过4000时使用,默认的表单控件是Textarea
  592.  
  593. IntegerField
  594. 整数
  595.  
  596. DecimalField(max_digits=None, decimal_places=None)
  597. 使用PythonDecimal实例表示的十进制浮点数
  598. 参数说明
  599. DecimalField.max_digits
  600. 位数总数
  601. DecimalField.decimal_places
  602. 小数点后的数字位置
  603.  
  604. FloatField
  605. 使用Pythonfloat实例来表示的浮点数
  606.  
  607. BooleanField
  608. True/False 字段,此字段的默认表彰控制是CheckboxInput
  609.  
  610. NullBooleanField
  611. 支持 Null, True, False 三种值
  612.  
  613. DateField([auto_now=False, auto_now_add=False])
  614. 使用Pythondatetime.date实例表示的日期
  615. 参数说明:
  616. DateField.auto_now
  617. 每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”
  618. 的时间戳,它总是使用当前日期,默认为 False
  619. DateField.auto_now_add
  620. 当前对象第一次被创建时自动设置当前时间,用于创建的时间戳,
  621. 它总是使用当前日期,默认为 False
  622. 说明
  623. 该字段默认对应的表单控件是一个TextInput.在管理员站点添加了一个
  624. JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外
  625. invalid_date错误消息键
  626. 注意
  627. auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间
  628. 的任何组合将会发生错误的结果
  629.  
  630. TimeField
  631. 使用Pythondatetime.time实例表示的时间,参数同DateField
  632.  
  633. DateTimeField
  634. 使用Pythondatetime
  635. datetime实例表示的日期和时间,参数同DateField
  636.  
  637. FileField
  638. 一个上传文件的字段
  639.  
  640. ImageField
  641. 继承了FileField的所有属性和方法,但对上传的对象进行校验,
  642. 确保它是一个有效的image
  643.  
  644. 字段选项
  645. 概述
  646. 通过字段选项,可以实现对字段的约束
  647. 在字段对象中通过关键字参数指定
  648.  
  649. null
  650. 如果为True,Django将空值以NULL存储在数据库中,默认值为 False
  651.  
  652. blanke
  653. 如果为True,则该字段允许为空白,默认值为 False
  654.  
  655. 注意
  656. null是数据库范畴的概念,blank是表彰验证范畴的概念
  657.  
  658. db_column
  659. 字段的名称,如果未指定,则使用属性的名称
  660.  
  661. db_index
  662. 若值为 True,则在表中会为此字段创建索引
  663.  
  664. default
  665. 默认值
  666.  
  667. primary_key
  668. 若为 True,则该字段会成为模型的主键字段
  669.  
  670. unique
  671. 如果为 True,这个字段在表中必须有唯一值
  672.  
  673. 关系
  674. 分类
  675. ForeignKey:一对多,将字段定义在多的端中
  676. ManyToManyField:多对多,将字段定义在两端中
  677. OneToOneField:一对一,将字段定义在任意一端中
  678.  
  679. 用一访问多
  680. 格式
  681. 对象.模型类小写_set
  682. 示例
  683. grade.students_set
  684.  
  685. 用一访问一
  686. 格式
  687. 对象.模型类小写
  688. 示例
  689. grade.studnets
  690.  
  691. 访问id
  692. 格式
  693. 对象.属性_id
  694. 示例
  695. student.sgrade_id
  696.  
  697. 视图
  698. 概述:
  699. 作用:视图接收web请求,并响应web请求
  700. 本质:视图就是python中的一个函数
  701. 响应:
  702. 响应过程:
  703. 用户在浏览器中输入网址www.sunck.wang/sunck/index.html
  704. ---网址--->
  705. django获取网址信息,去掉IP与端口号,网址变成:sunck/index.html
  706. ---虚拟路径与文件名--->
  707. url管理器逐个匹配urlconf,记录视图函数
  708. ---视图函数名--->
  709. 视图管理,找到对应的视图去执行,返回结果给浏览器
  710. ---响应的数据--->
  711. 返回第一步:用户在浏览器中输入网址
  712. 网页
  713. 重定向
  714. 错误视图
  715. 404视图:找不到网页(url匹配不成功时返回)时返回
  716. templates目录下定义404.html
  717. <!doctype html>
  718. <html lang="en">
  719. <head>
  720. <meta charset="UTF-8">
  721. <meta name="viewport"
  722. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  723. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  724. <title>Document</title>
  725. </head>
  726. <body>
  727. <h1>页面丢失</h1>
  728. <h2>{{request_path}}</h2>
  729. </body>
  730. </html>
  731. request_path:导致错误的网址
  732. 配置settings.py
  733. DEBUG
  734. 如果为 True,永远不会调用404页面,需要调整为 False 才会显示
  735. ALLOWED_HOSTS = ['*']
  736. 500视图:在视图代码中出现错误(服务器代码错误)
  737. 400视图:错误出现在客户的操作
  738. JSON数据
  739. url配置
  740. 配置流程:
  741. 制定根级url配置文件
  742. settings.py文件中的ROOT_URLCONF
  743. ROOT_URLCONF = 'project.urls'
  744. 默认实现了
  745. urlpatterns
  746. 一个url实例的列表
  747. url对象
  748. 正则表达式
  749. 视图名称
  750. 名称
  751. url匹配正则的注意事项
  752. 如果想要从url中获取一个值,需要对正则加小括号
  753. 匹配正则前方不需要加'/'
  754. 正则前需要加'r'表示字符串不转义
  755. 引入其他url配置
  756. 在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py中使用include方法
  757. project\urls.py
  758. from django.contrib import admin
  759. from django.conf.urls import url,include
  760. urlpatterns = [
  761. url(r'^admin/', admin.site.urls),
  762. url(r'^', include('myApp.urls', namespace="myAPP")),
  763. ]
  764. myApp\urls.py
  765. from django.urls import path, include
  766. from django.conf.urls import url
  767. from . import views
  768. urlpatterns = [
  769. url(r'^$', views.index, name="index"),
  770. ]
  771. url的反向解析
  772. 概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
  773. 解决:在使用链接时,通过url配置的名称,动态生成url地址
  774. 作用:使用url模板
  775. 视图函数
  776. 定义视图:
  777. 本质:一个函数
  778. 视图参数:
  779. 一个HttpRequest的实例
  780. 通过正则表达式获取的参数
  781. 位置:一般在views.py文件下定义
  782. HttpRequest对象
  783. 概述:
  784. 服务器接收http请求后,会根据报文创建HttpRequest对象
  785. 视图的第一个参数就是HttpRequest对象
  786. django创建的,之后调用视图时传递给视图
  787. 属性
  788. path:请求的完整路径(不包括域名和端口)
  789. method:表示请求的方式,常用的有GET,POST
  790. encoding:表示浏览器提交的数据的编码方式,一般为utf-8
  791. GET:类似于字典的对象,包含了get请求的所有参数
  792. POST:类似于字典的对象,包含了post请求的所有参数
  793. FILES:类似字典的对象,包含了所有上传的文件
  794. COOKIES:字典,包含所有的cookie
  795. session:类似字典的对象,表示当前会话
  796. 方法
  797. is_ajax():如果是通过XMLHttpRequest发起的,返回 True
  798. QueryDict对象
  799. request对象中的GET,POST都属于QueryDict对象
  800. 方法:
  801. get():
  802. 根据键获取值,只能获取一个值
  803. www.sunck.wang/abc?a=1&b=2&c=3
  804. getlist()
  805. 将键的值以列表的形式返回
  806. 可以获取多个值
  807. www.sunck.wang/abc?a=1&b=2&c=3
  808. GET属性
  809. 获取浏览器传递过来数据
  810. www.sunck.wang/abc?a=1&b=2&c=3
  811. urls.py
  812. url(r'^get1', views.get1), #结尾不能加$,否则无法匹配
  813. views.py
  814. def get1(request):
  815. a = request.GET.get('a')
  816. b = request.GET.get('b')
  817. c = request.GET.get('c')
  818. return HttpResponse(a + " " + b + " " + c)
  819.  
  820. www.sunck.wang/abc?a=1&a=2&c=3
  821. urls.py
  822. url(r'^get2', views.get2),
  823. views.py
  824. def get2(request):
  825. a = request.GET.getlist('a')
  826. a1 = a[0]
  827. a2 = a[1]
  828. c = request.GET.get('c')
  829. return HttpResponse(a1 + " " + a2 + " " + c)
  830. POST属性
  831. 使用表单模拟POST请求
  832. 关闭CSRF:project\project\settings.py
  833. MIDDLEWARE = [
  834. 'django.middleware.security.SecurityMiddleware',
  835. 'django.contrib.sessions.middleware.SessionMiddleware',
  836. 'django.middleware.common.CommonMiddleware',
  837. # 'django.middleware.csrf.CsrfViewMiddleware',
  838. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  839. 'django.contrib.messages.middleware.MessageMiddleware',
  840. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  841. ]
  842. 示例:
  843. def showregist(request):
  844. return render(request, 'myApp/regist.html',)
  845.  
  846. def regist(request):
  847. name = request.POST.get("name")
  848. gender = request.POST.get("gender")
  849. age = request.POST.get("age")
  850. hobby = request.POST.getlist("hobby")
  851. print(name)
  852. print(gender)
  853. print(age)
  854. print(hobby)
  855. return HttpResponse("regist")
  856. 路径:
  857. url(r'^showregist/$', views.showregist),
  858. url(r'^showregist/regist/$', views.regist),
  859. 页面:
  860. <!doctype html>
  861. <html lang="en">
  862. <head>
  863. <meta charset="UTF-8">
  864. <meta name="viewport"
  865. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  866. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  867. <title>注册</title>
  868. </head>
  869. <body>
  870. <form action="regist/" method="post">
  871. 姓名:<input type="text" name="name" value=""/>
  872. <hr>
  873. 性别:<input type="radio" name="gender" value="">男<input type="radio" name="gender" value="">女
  874. <hr>
  875. 爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
  876. <hr>
  877. <input type="submit" value="注册">
  878. </form>
  879. </body>
  880. </html>
  881. HttpResponse对象
  882. 概述:
  883. 作用:给浏览器返回数据
  884. HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建
  885. 用法:
  886. 不用模板,直接返回数据
  887. 语句示例:return HttpResponse("Sunck is a good man")
  888. 调用模板
  889. 使用render方法
  890. 原型:render(request, templateName[, context])
  891. 作用:结合数据和模板,返回一个完整的HTML页面
  892. 参数:
  893. request:请求体对象
  894. templateName:模板路径
  895. context:传递给需要渲染在模板上的数据
  896. 属性
  897. content:表示返回内容
  898. charset:编码格式
  899. status_code:响应状态码
  900. 200
  901. 304
  902. 404
  903. 400
  904. content-type:指定输出的MIME类型
  905. 方法
  906. init:使用页面内容实例化HttpResponse对象
  907. write(content):以文件的形式写入
  908. flush():以文件的形式输出缓冲区
  909. set_cookie(key, value, maxAge=None, exprise=None)
  910. delete_cookie(key):
  911. 删除cookie
  912. 如果删除一个不存在的cookie,就当什么都没发生
  913. 子类HttpResponseRedirect
  914. 功能:重定向,服务器端的跳转
  915. 简写
  916. redirect(to)
  917. to推荐使用反向解析
  918. 示例:
  919. from django.http import HttpResponseRedirect
  920. from django.shortcuts import redirect
  921. def redirect1(request):
  922. # return HttpResponseRedirect('/redirect2')
  923. return redirect('/redirect2')
  924. def redirect2(request):
  925. return HttpResponse("我是重定向后的视图")
  926. 子类JsonResponse
  927. 返回Json数据,一般用于异步请求
  928. __init__(self.data)
  929. data 字典
  930. 注意:Content-type类型为application/json
  931. 状态保持
  932. http协议是无状态的,每次请求都是一次新的请求,它不记得之前的请求。
  933. 客户端与服务器的一次通信就是一次会话
  934. 实现状态的保持,在客户端或服务端存储有关会话的数据
  935. 存储的方式
  936. cookie:所有数据存储在客户端,不要存储敏感的数据
  937. session:所有的数据存储在服务端,在客户端用cookie存储session_id
  938. 状态保持的目的:
  939. 在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
  940. 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
  941. 启用session:project\project\settings.py
  942. INSTALLED_APPS 'django.contrib.sessions',
  943. MIDDLEWARE 'django.contrib.sessions.middleware.SessionMiddleware',
  944. 使用session
  945. 启用session后,每个httpRequest对象都有一个session属性
  946. get[key, default=None] 根据键获取session
  947. clear() 清空所有会话
  948. flush() 删除当前会话并删除会话的cookie
  949. 示例:
  950. # session
  951. def main(request):
  952. # 取session
  953. username = request.session.get('name', '游客')
  954. print(username)
  955. return render(request, 'myApp/main.html', {'username': username})
  956.  
  957. def login(request):
  958. return render(request, 'myApp/login.html')
  959.  
  960. def showmain(request):
  961. print("*****************")
  962. username = request.POST.get('username')
  963. # 存储session
  964. request.session['name'] = username
  965. return redirect('/main/')
  966.  
  967. from django.contrib.auth import logout
  968. def quit(request):
  969. # 清除session
  970. logout(request) # 方法1,推荐
  971. # request.session.clear() # 方法2
  972. request.session.flush() # 方法3
  973. return redirect('/main/')
  974. 设置session过期时间
  975. set_expiry(value)
  976. request.session.set_expiry(10) 设置为10秒后过期
  977. 如果不设置,2个星期后过期
  978. value设置为0代表关闭浏览器时过期
  979. value设置为None代表设置永不过期,不推荐
  980.  
  981. Redis使用:略
  982.  
  983. ************************************************************************************************************
  984. ****************************************第二篇笔记从这里开始************************************************
  985. ************************************************************************************************************
  986.  
  987. 模板
  988. 定义模板
  989. 变量
  990. 变量传递给模板的数据
  991. 要遵守标识符规则
  992. 语法 {{ var }}
  993. 注意:如果使用的变量不存在,则插入的是空字符串
  994. 在模板中使用点语法
  995. 字典查询
  996. 属性或者方法
  997. 数字索引
  998. 在模板中调用对象的方法
  999. 注意:在模板里定义的函数不能传递self以外的参数
  1000. 标签:语法 {% tag %}
  1001. 作用
  1002. 在输出中创建文本
  1003. 控制逻辑和循环
  1004. 标签示例:
  1005. if 格式
  1006. {% if 表达式 %}
  1007. 语句
  1008. {% endif %}
  1009. if-else 格式
  1010. {% if 表达式 %}
  1011. 语句1
  1012. {% else %}
  1013. 语句else
  1014. {% endif %}
  1015. if-elif-else 格式
  1016. {% if 表达式 %}
  1017. 语句1
  1018. {% elif 表达式 %}
  1019. 语句2
  1020. ...
  1021.  
  1022. {% else %}
  1023. 语句else
  1024. {% endif %}
  1025. for 格式
  1026. {% for 变量 in 列表 %}
  1027. 语句
  1028. {% endfor %}
  1029. 格式2
  1030. {% for 变量 in 列表 %}
  1031. 语句
  1032. {% empty %} # 注意:列表为空或者列表不存在时执行语句2
  1033. 语句2
  1034. {% endfor %}
  1035. 格式3
  1036. {{ forloop.counter }}
  1037. 示例:
  1038. <ul>
  1039. {% for stu in students %}
  1040. <li>
  1041. {{forloop.counter}}--{{stu.sname}}--{{stu.sgrade}}
  1042. </li>
  1043. {% empty %}
  1044. <li>目前没有学生</li>
  1045. {% endfor %}
  1046. commnet 格式
  1047. {% commnet %}
  1048. 被注释的内容
  1049. {% endcomment %}
  1050. 作用:相当于多行注释,被注释的内容不再执行
  1051. ifequal/ifnotequal 作用 判断是否相等或者不相等
  1052. 格式
  1053. {% ifequal 1 2 %}
  1054. 语句1
  1055. {% endifequal %} # 如果值1等于值2,执行语句1,否则不执行语句1
  1056. include
  1057. 作用:加载模板并以标签内的参数渲染
  1058. 格式:{% include '模板目录' 参数1 参数2 %}
  1059. url
  1060. 作用:反射解析
  1061. 格式:{% url 'namespace: name' p1 p2 %}
  1062. csrf_token
  1063. 作用:用于跨站请求伪造保护
  1064. 格式:{% csrf_token %}
  1065. block, extends
  1066. 作用:用于模板的继承
  1067. autoescape
  1068. 作用:用于HTML转义
  1069. 过滤器
  1070. 语法 {{ var|过滤器 }}
  1071. 作用:在变量被显示前修改它,只是加一个效果,对变量不会造成影响
  1072. 示例:
  1073. lower
  1074. upper
  1075. 过滤器可以传递参数,参数用引号引起来
  1076. join 格式 列表|join:"#"
  1077. 示例:{{list1|join:"#"}}
  1078. 如果一个变量没有被提供,或者值为false,空,我们可以通过 default 语法使用默认值
  1079. 格式: {{str1|default:"没有"}}
  1080. 根据给定格式转换日期为字符串:date
  1081. 格式: {{dateVal|date:'y-m-d'}}
  1082. HTML转义:escape
  1083. 加减乘除示例:
  1084. <h1>num = {{num|add:10}}</h1>
  1085. <h1>num = {{num|add:-10}}</h1>
  1086. <h1>num = {% num widthratio num 1 5%}</h1>
  1087. <h1>num = {% num widthratio num 5 1%}</h1>
  1088. 注释
  1089. 单行注释:语法: {# 被注释的内容 #}
  1090. 多行注释
  1091. {% commnet %}
  1092. 被注释的内容
  1093. {% endcomment %}
  1094.  
  1095. 反射解析
  1096. 示例:
  1097. project/project/urls.py
  1098. url(r'^', include('myApp.urls', namespace='app')),
  1099. project/myApp/urls.py
  1100. url(r'^good/(\d+)$', views.good, name="good")
  1101. templates/good.html
  1102. <a href={% url 'app:good' 1 %}>链接</a>
  1103.  
  1104. 模板继承
  1105. 作用:模板继承可以减少页面的重复定义,实现页面的重用
  1106. block标签:在父模板中预留区域 ,子模板去填充
  1107. 语法 {% block 标签名 %}
  1108.  
  1109. {% endblock 标签名 %}
  1110. extends标签:继承模板,需要写在模板文件的第一行
  1111. 语法 {% extends 'myApp/base.html' %}
  1112. {% block main %}
  1113. 内容
  1114. {% endblock 标签名 %}
  1115. 示例:
  1116. 定义父模板
  1117. body标签中
  1118. {% block main %}
  1119.  
  1120. {% endblock main %}
  1121.  
  1122. {% block main %}
  1123.  
  1124. {% endblock main2 %}
  1125. 定义子模板
  1126. {% extends 'myApp/base.html' %}
  1127. {% block main %}
  1128. <h1>sunck is a good man</h1>
  1129. {% endblock main %}
  1130.  
  1131. {% block main2 %}
  1132. <h1>kaige is a good man</h1>
  1133. {% endblock main2 %}
  1134.  
  1135. HTML转义
  1136. 问题:return render(request, 'myApp/index.html', {"code": "<h1>sunck is a very good man</h1>"})中的{{code}}
  1137. {{code}}里的code被当作<h1>sunck is a very good man</h1>显示,未经过渲染
  1138. 解决方法:
  1139. {{code|safe}}
  1140. {% autoescape off %}
  1141. {{code}}
  1142. {% endautoescape %} # 这个可以一口气解决一堆
  1143.  
  1144. CSRF:
  1145. 跨站请求伪造
  1146. 某些恶意网站包含链接,表单,按钮,js,利用登录用户在浏览器中认证,从而攻击服务
  1147. 防止CSRF
  1148. settings.py文件的MIDDLEWARE增加'django.middleware.csrf.CsrfViewMiddleware'
  1149. {% csrf_token %}
  1150.  
  1151. 验证码
  1152. 作用
  1153. 在用户注册,登录页面的时候使用,为了防止暴力请求,减轻服务器的压力
  1154. 是防止CSRF的一种方式
  1155.  
  1156. 验证码代码示例:
  1157. 写在views.py里面
  1158. =================================================================================================
  1159. def verifycode(request):
  1160. # 引入绘图模块
  1161. from PIL import Image, ImageDraw, ImageFont
  1162. # 引入随机函数模块
  1163. import random
  1164. # 定义变量,用于画面的背景色,宽,高
  1165. bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))
  1166. width = 100
  1167. height = 50
  1168. # 创建画面对象
  1169. im = Image.new('RGB', (width, height), bgcolor)
  1170. # 创建画面对象
  1171. draw = ImageDraw.Draw(im)
  1172. # 调用画笔的point()函数绘制噪点
  1173. for i in range(0, 100):
  1174. xy = (random.randrange(0, width), random.randrange(0, height))
  1175. fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
  1176. draw.point(xy, fill=fill)
  1177. # 定义验证码的备选值
  1178. str = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
  1179. # 随机选取4个值作为验证码
  1180. rand_str = ''
  1181. for i in range(0, 4):
  1182. rand_str += str[random.randrange(0, len(str))]
  1183. # 构造字体对象
  1184. font = ImageFont.truetype(r'C:\Windows\Fonts\AdobeArabic-Bold.otf', 40)
  1185. # 构造字体颜色
  1186. fontcolor1 = (255, random.randrange(0, 255), random.randrange(0, 255))
  1187. fontcolor2 = (255, random.randrange(0, 255), random.randrange(0, 255))
  1188. fontcolor3 = (255, random.randrange(0, 255), random.randrange(0, 255))
  1189. fontcolor4 = (255, random.randrange(0, 255), random.randrange(0, 255))
  1190. # 绘制4个字
  1191. draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
  1192. draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
  1193. draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
  1194. draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
  1195. # 释放画笔
  1196. del draw
  1197. # 存入session,用于做进一步的验证
  1198. request.session['verifycode'] = rand_str
  1199. # 内存文件操作
  1200. import io
  1201. buf = io.BytesIO()
  1202. # 将图片保存在内存中,文件类型为png
  1203. im.save(buf, 'png')
  1204. # 将内存中的图片数据返回给客户端,MIME类型为图片png
  1205. return HttpResponse(buf.getvalue(), 'image/png')
  1206.  
  1207. from django.shortcuts import render, redirect
  1208. def verifycodefile(request):
  1209. f = request.session["falg"]
  1210. str = ""
  1211. if f == False:
  1212. str = "请重新输入!"
  1213. request.session.clear()
  1214. return render(request, 'myApp/verifycodefile.html', {"flag":str})
  1215.  
  1216. def verifycodecheck(request):
  1217. code1 = request.POST.get("verifycode").upper()
  1218. code2 = request.session["verify"].upper()
  1219. if code1 == code2:
  1220. return render(request, 'myApp/success.html')
  1221. else:
  1222. request.session["flag"] = False
  1223. return redirect('/verifycodefile')
  1224.  
  1225. ==============================================================================
  1226. 写在verifycodefile.html的<body>标签中
  1227. <body>
  1228. <form method="post" action="/verifycodecheck/">
  1229. {%csrf_token%}
  1230. <input type="text" name="verifycode"/>
  1231. <img src="/verifycode">
  1232. <input type="submit" name="登录">
  1233. <span>{{flag}}</span>
  1234. </form>
  1235. </body>
  1236.  
  1237. ==============================================================================
  1238.  
  1239. Django高级扩展
  1240. 静态文件
  1241. css,js,图片,json文件,字体文件等
  1242. 配置settings.py
  1243. STATIC_URL = '/static'
  1244. STATICFILES_DIRS = [
  1245. os.path.join(BASE_DIR, 'static')
  1246. ]
  1247.  
  1248. 中间件
  1249. 概述:一个轻量级,底层的插件,可以介入Django的请求和响应。
  1250. 本质:一个Python
  1251. 方法:
  1252. __init__
  1253. 不需要传参数,服务器响应第一个请求的时候自动调用,用于确定是否启用该中间件
  1254. process_request(self, request)
  1255. 在执行视图之前被调用(分配url匹配视图之前),每个请求都会调用,返回None或者HttpResponse对象
  1256. process_view(self, request, view_func. view_args, view_kwargs)
  1257. 调用视图之前执行,每个请求都会调用,返回None或者HttpResponse对象
  1258. process_template_response(self, request, response)
  1259. 在视图刚好执行完后调用,每个请求都会调用,返回None或者HttpResponse对象
  1260. 使用render
  1261. process_response(self, request, response)
  1262. 所有响应返回浏览器之前调用,每个请求都会调用,返回HttpResponse对象
  1263. process_exception(self, request, exception)
  1264. 当视图抛出异常时调用,返回HttpResponse对象
  1265. 执行过程:
  1266. __init__ --> process_request--> url --> process_view --> view --> process_template_response --> template --> process_response -->返回开头部分
  1267. 执行位置:
  1268. 自定义中间件
  1269. 在工程目录下的middleware目录下创建myApp
  1270. 创建一个python文件
  1271. from django.utils.deprecation import middlewareMixin
  1272. class MyMiddle(middlewareMixin):
  1273. def process_request(self, request):
  1274. print("get参数为: ", request.GET.get("a"))
  1275. 使用自定义中间件
  1276. 配置settings.py文件 MIDDLEWARE中添加 'middleware.myApp.MyMiddle.MyMiddle',
  1277.  
  1278. 上传图片
  1279. 概述:
  1280. 文件上传时,文件数据request.FILES属性中.
  1281. 注意:form表单要上传文件需要加enctype="multipart/form-data"
  1282. 注意:上传文件必须用post请求
  1283. 存储路径:
  1284. static目录下创建upfile目录用于存储上传的文件
  1285. 配置settings.py文件 MDEIA_ROOT = os.path.join(BASE_DIR, r'static\upfile')
  1286.  
  1287. views.py内容
  1288. ==============================================================================
  1289. def upfile(request):
  1290. return render(request, 'myApp/upfile.html')
  1291.  
  1292. import os
  1293. from django.conf import settings
  1294. def savefile(request):
  1295. if request.method == "POST":
  1296. f = request.FILES["file"]
  1297. # 文件在服务器端的路径
  1298. filePath = os.pasth.join(settings.MDEIA_ROOT, f.name)
  1299. with open(filePath, 'wb') as fp:
  1300. for info in f.chunks():
  1301. fp.write(info)
  1302. return HttpResponse("上传成功。")
  1303. else:
  1304. return HttpResponse("上传失败。")
  1305. ==============================================================================
  1306. upfile.html中<body>里的内容
  1307. <body>
  1308. <form method="post" action="/savefile" enctype="multipart/form-data">
  1309. {%csrf_token%}
  1310. <input type="file" name="file"/>
  1311. <input type="submit" value="上传"/>
  1312. </form>
  1313. </body>
  1314. ==============================================================================
  1315.  
  1316. 分页
  1317. Paginator对象
  1318. 创建对象
  1319. 格式 Paginator(列表,整数)
  1320. 返回值 返回的分页对象
  1321. 属性
  1322. count 对象总数
  1323. num_pages 页面总数
  1324. page_range
  1325. 页码列表
  1326. [1,2,3,4,5]
  1327. 页码从1开始
  1328. 方法
  1329. page(num) 获得一个Page对象,如果提供的页码不存在会抛出"InvalidPage"异常
  1330. 异常
  1331. InvalidPage:当向 page()传递的是一个无效的页码时抛出
  1332. PageNotAnInteger:当向 page()传递的不是一个整数时抛出
  1333. EmptyPage:当向 page()传递一个有效值,但是该页面里没有数据时抛出
  1334. Page对象
  1335. 创建对象
  1336. Paginator对象的 page()方法返回得到Page对象
  1337. 不需要手动创建
  1338. 属性
  1339. object_list:当前页上所有数据(对象)列表
  1340. number:当前页面的页码值
  1341. paginator:当前page对象关联的paginator对象
  1342. 方法
  1343. has_next() 判断是否有下一页,如果有返回 True
  1344. has_previous() 判断是否有上一页,如果有返回 True
  1345. has_other_pages() 判断是否有上一页或者下一页,如果有返回 True
  1346. next_page_number() 返回下一页的页码,如果下一页不存在抛出InvalidPage异常
  1347. previous_page_number() 返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
  1348. len() 返回当前页的数据(对象)个数
  1349.  
  1350. PaginatorPage对象关系(略)
  1351. 代码示例:
  1352. 配置路由:url(r'^studentpage/(\d+)/$', views.studentpage),
  1353. 配置视图:
  1354. from .models import Students
  1355. from django.core.paginator import Paginator
  1356. def studentpage(request, pageid):
  1357. # 所有学生列表
  1358. allList = Students.objects.all()
  1359. paginator = Paginator(allList, 6)
  1360. page = paginator.page(pageid)
  1361. return render(request, 'myApp/studentpage.html', {"students": page})
  1362. 配置html
  1363. studentpage.htmlbody标签中的内容:
  1364. <body>
  1365. <ul>
  1366. {% for stu in students %}
  1367. <li>
  1368. {{stu.sname}}--{{stu.sgrade}}
  1369. </li>
  1370. {% endfor %}
  1371. </ul>
  1372. <ul>
  1373. {% for index in students.paginator.page_range %}
  1374. {% if index == students.number %}
  1375. <li>
  1376. {{index}}
  1377. </li>
  1378. {% else %}
  1379. <li>
  1380. <a href="/sunck/studentpage/{{index}}">{{index}}</a>
  1381. </li>
  1382. {% endif %}
  1383. {% endif%}
  1384. </ul>
  1385. </body>
  1386. ==============================================================================
  1387.  
  1388. ajax
  1389. 需要动态生成,请求JSON数据
  1390. 代码示例
  1391. ajaxstudents.html页面示例
  1392. <script type="text/javascript" src="/static/myApp/js/jquery-3.1.1.min.js"></script>
  1393. <body>
  1394. <h1>学生信息列表</h1>
  1395. <button id="btn">显示学生信息</button>
  1396. <script type="text/javascript" src="/static/myApp/js/sunck.js"></script>
  1397. </body>
  1398.  
  1399. sunck.js代码示例
  1400. $(document).ready(function (){
  1401. document.getElementById("btn").onclick = function (){
  1402. $.ajax({
  1403. type:"get",
  1404. url:"/studentsinfo/",
  1405. dataType:"json",
  1406. success:function(data, status){
  1407. console.log(data)
  1408. var d = data["data"]
  1409. for(var i=0; i<d.length; i++){
  1410. document.write('<p>' + d[i][0] + '</p>')
  1411. }
  1412. }
  1413. })
  1414. }
  1415. })
  1416.  
  1417. views.py代码示例
  1418. def ajaxstudents(request):
  1419. return render(request, 'myApp/ajaxstudents.html')
  1420.  
  1421. from django.http import JsonResponse
  1422. def studentsinfo(request):
  1423. stus = Students.objects.all()
  1424. list = []
  1425. for stu in stus:
  1426. list.append([stu.sname, stu.sage])
  1427. return JsonResponse({"data":list})
  1428. ==============================================================================
  1429.  
  1430. 富文本
  1431. pip install django-tinymce
  1432. 在站点中使用
  1433. 配置settings.py文件
  1434. INSTALLED_APPS 列表中添加 'tinymce',
  1435. 增加
  1436. # 富文本
  1437. TINYMCE_DEFAULT_CONFIG = {
  1438. 'theme':'advanced',
  1439. 'width':600,
  1440. 'height':400,
  1441. }
  1442. 创建一个模型类:
  1443. models.py文件中增加
  1444. from tinymce.models import HTMLField
  1445. class Text(models.Model):
  1446. str = HTMLField()
  1447. 配置站点:
  1448. from .models import Text
  1449. admin.site.register(Text)
  1450.  
  1451. 自定义视图使用
  1452. <head>
  1453. <meta charset="UTF-8">
  1454. <title>富文本</title>
  1455. <script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
  1456. <script type="text/javascript">
  1457. tinyMCE.init({
  1458. 'mode':'textareas',
  1459. 'theme':'advanced',
  1460. 'width':'',
  1461. 'height':'',
  1462. })
  1463. </script>
  1464. </head>
  1465. <body>
  1466. <form action="/saveedit/" method="post">
  1467. <textarea name="str">sunck is a good man</textarea>
  1468. <input type="submit" value="提交"/>
  1469. </form>
  1470. </body>
  1471.  
  1472. Celery
  1473. http://docs.jinkan.org/docs/celery/
  1474. 问题:
  1475. 用户发起request,并且要等待response返回,但在视图中有一些耗时的操作,
  1476. 导致用户可能会等待很长时间才能接收response,这样用户体验很差
  1477. 网站每隔一段时间要同步一次数据,但是http请求是需要触发的
  1478. 解决:
  1479. celery来解决
  1480. 将耗时的操作放在celery中执行
  1481. 使用celery定时执行
  1482. celery:
  1483. 任务task
  1484. 本质是一个Python函数,将耗时的操作封装成一个函数
  1485. 队列queue
  1486. 将要执行的任务放在队列里
  1487. 工人worker
  1488. 负责执行对列中的任务
  1489. 代理broker
  1490. 负责高度,在部署环境中使用redis
  1491. 安装:
  1492. pip install celery
  1493. pip install celery-with-redis
  1494. pip install django-celery
  1495. 配置settings.py
  1496. INSTALLED_APPS 列表中添加 'djcelery',
  1497. # Celery
  1498. import djcelery
  1499. djcelery.setup_loader() # 初始化
  1500. BROKER_URL='redis://:sunck@127.0.0.1:6379/0'
  1501. CELERY_IMPORTS=('myApp.task')
  1502. 在应用目录下创建task.py文件
  1503. 迁移生成celery需要的数据库表:python manage.py migrate
  1504. 在工程目录下的project目录下创建celery.py文件
  1505. celery.py文件全部内容
  1506. from __future__ import absolute_import
  1507.  
  1508. import os
  1509. from celery import Celery
  1510. from django.conf import settings
  1511.  
  1512. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings')
  1513.  
  1514. app = Celery('portal')
  1515.  
  1516. app.config_from_object('django.conf:settings')
  1517. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  1518.  
  1519. @app.task(bind=True)
  1520. def debug_task(self):
  1521. print('request: {0!r}'.format(self.request))
  1522. 在工程目录下的 project目录下的 __init__.py文件中添加

Django 千锋培训的学习笔记(2)的更多相关文章

  1. Django 千锋培训的学习笔记(1)

    Django 千锋培训读书笔记 https://www.bilibili.com/video/av17879644/?p=1 切换到创建项目的目录 cd C:\Users\admin\Desktop\ ...

  2. 一千行 MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  3. <深圳千锋学习>day01

    2019.11.11     深圳千锋H5前端学习笔记

  4. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  5. Vue学习笔记-rest_framework_jwt 学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  6. Vue学习笔记-vue-element-admin 前端学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  7. Vue学习笔记-vue-element-admin 按装报错再按装

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  8. 两千行PHP学习笔记

    亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...

  9. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

随机推荐

  1. 执行脚本 提示 command not found

    问题现象: 初学shell,写了个脚本, 1.从windows 写好 脚本,然后部署到 linux 上. 2.chmod +x之后执行提示command not found,系统环境redhat9,用 ...

  2. PHP 字符 正则表达式 +,*,?

    1.“/”是定界符,“/”定界符之间的部分就是将要在目标对象中进行匹配的模式.同时为了正则更加灵活,引入了元字符,即“+”, “*”,以及 “?”. (1)“+”元字符规定其前导字符必须在目标对象中连 ...

  3. REST访问(RestTemplate)

    https://www.cnblogs.com/softidea/p/6910198.html 经常需要发送一个GET/POST请求到其他系统(REST API),通过JDK自带的HttpURLCon ...

  4. scrapy安装遇到的Twisted问题

    贴上大佬的博客地址:https://blog.csdn.net/a19990412/article/details/78849881 电脑一直在爆下面这一堆的信息 Command”c:\users\l ...

  5. while嵌套应用二:九九乘法表

    __author__ = 'zht' #!/usr/bin/env python # -*- coding: utf-8 -*- ''' #努力学习每一天 ''' #while嵌套应用二:九九乘法表 ...

  6. android布局不带参数返回

    package com.example.lesson3_4; import java.util.ArrayList; import java.util.List; import android.app ...

  7. 压力测试工具segie的使用

    压力测试工具segie的使用 使用文档参考地址:https://www.joedog.org/siege-manual/ siege4地址:http://download.joedog.org/sie ...

  8. 在web应用中使用日志

    Log4J是Jakarta下的一个开源代码的子项目,用Log4J,我们可以使用定制的格式,把调试信息和日志信息输出到一个或多个需要的地方. 在Web应用中一般使用一个专门的Servlet来完成Log4 ...

  9. winhex与磁盘格式与 数据恢复

    第一阶段: 熟悉WinHex的使用. n 熟悉磁盘工具的使用. n 利用WinHex查看物理磁盘和逻辑磁盘. n 了解WinHex中相关工具的用法. 以管理员身份运行winhex(以便之后修改) 上方 ...

  10. Base64编码密钥时关于换行的几个问题。

    在windows下一个javaweb应用,需要用http传递公钥pk.一般是String pk = BASE64ENCODER.encode(pkBytes);base64编码时,每76个字母就要换行 ...