3.基础知识点回顾
一、web应用
1.1、web应用
应用程序有两种的模式,分别是b/s以及c/s。
b/s为浏览器与服务端之间的应用程序,而c/s为客户端与服务端之间的程序
web就是b/s模式的应用程序,他只需要用户少量硬盘的资源,其余都在服务端之上,并且不用更新
由于完全是远距离传输,因此对浏览器以及互联网的连接比较依赖
1.2、web框架
Python的web框架主要要三种:分别是Django、flask、tornado
Django的特点是大而全,自带的动能比较多,但是过于笨重
flask的特点是小而精,第三方模块比较多,比较依赖于第三方模块
tornado的特点是异步非阻塞,支持高并发
1.3、wsgi协议
wsgi协议是Python种的一个协议,规定了怎么拆封HTTP协议
HTTP协议数据传输使用的是明文,HTTPS协议数据传输使用的是密文
1.4、模板文件的渲染
models在后端渲染完,只要出了Django框架,就是完整的HTML,CSS,JS
二、路由控制
2.1、Django的框架类型
Django是一种同步框架,其中1.x版本和2.x版本在路由URL上是不同的
1.x版本上是使用URL,2.x上使用的是path
2.2、Django的路由写法
先导入URL,其中参数(传递给视图函数的默认形式,使用字典类型)和别名可以不写
from Django.conf.urls import url
urlpatterns = [ url(正则表达式,views视图函数,参数,别名)]
2.3、APPEND_SLASH
Django setting.py配置中没有append_slash,其中Django默认append_slash = Ture,主要作用是在URL的末尾默认加入/,如果将append_slash = False加入setting.py中,就能取消/
2.4、有名分组和无名分组
有名分组和无名分组主要区别在于是否有(?p
有名分组:re_path(r^article/(?p
无名分组:re_path (r^article/(0-9){4}/$views.year_archive)
2.5、路由分发
将一个总路由分发给多个子路由
路由分发:url(r'^app01/',include(app01.urls))
子路由连接视图views:from django.conf.urls import url
from app01 import views
urlpatterns = [ url(r'^reg/',views.reg)]
2.6、反向解析
反向解析是同过后端向前端传递变量,通常传递的变量数据是主键值,用来处理数据的增删改查
使用的是reverse模块
from django.shortcuts import reverse
url = reverse('test',args=(10,20)) 通过URL别名的一致,URL传递变量数据
2.7、名称空间
由于子路由中,可能会出现相同的URL的别名,而反向解析是通过URL中的别名进行定位,因此Python建立了名称空间保证了互不干扰。
为了更好的识别子路由中对应的URL,因此在别名前添加子路由的信息,使其具有唯一性
urlpatterns = [url(r'^reg/',views.reg,name='app01_reg')]
2.8、内置转换器
Django2.x不支持URL,只能使用path
path不支持正则,但是能用五种转换器,将进行限制path的第二路由,分别是:
1.str:可以匹配除了/以外的非空字符,为默认形式
2.int:匹配正整数,包括0
3.slug:匹配字母、数字、横杠、下划线组成的字符串
4.uuid:匹配格式化的uuid,例如: 075194d3-6885-417e-a8a8-6c931e272f00
5.path:匹配非空字符串
path('index/<int:id>',index)
2.9、自定义的转换器
class MonthConverter:
regex='\d{2}' # 属性名必须为regex
def to_python(self, value):
return int(value)
def to_url(self, value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
from django.urls import path,register_converter
from app01.path_converts import MonthConverter
# 先注册转换器
register_converter(MonthConverter,'mon')
from app01 import views
urlpatterns = [
path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),
]
三、视图层
3.1、response对象
视图层响应对象的三种方式:分别是:
1.HttpResponse() 返回字符串类型
2.render() 返回HTML页面,并且在返回浏览器前还可以给HTML传值
3.redirect() 重定向
视图函数必须要返回一个HttpResponse
3.2、Jsonresponse对象
前端序列化:json.stringify() 前端反序列化:json.parse()
后端序列化:json.dumps() 后端反序列化:json.loads()
从后端向前端发送json格式的字符串有两种方式,一个是使用json.dumps()进行序列化,一个时使用Jsonresponse对象,进行序列化
import json
data = {'name':'ab'}
return HttpResponse(json.dumps(data)) #第一种
from django.http import JsonResponse
data1 = {'name':'ac'}
return JsonResponse(data1,safe = False) #第二种
3.3、request对象
request对象的使用方法:
request.method == :获取请求方式
request.post:只能获取普通的键值对数据,不能获取文件
request.get:获取get请求
request.files:获取文件
request.body:获取浏览器发过来的数据
request.path:只能获取路由,不能获取路由后面的参数
request.path_info :只能获取URL,不能获取路由后面的参数
request.get_full_path():获取URL后面完整的参数
3.4、301和302的区别
301为永久性的重定向,之前的路由已经失去
302位暂时性的重定向,之前的路由还在,只是暂时不能使用
3.5、CBV和FBV
3.5.1、CBV
class base views 基础类视图
使用类的基础视图,需要先从view里面继承view
from django.views import view
class Mylogin(view):
def get(self,request):
return render(request,'form.html')
def post(self,request):
return HttpRsponse('post方法')
3.5.2、FBV
function base views 基础函数视图
使用函数的基础视图,视图函数中必须要传request
def index(request):
return HttpResponse('index')
3.6、form表单的文件上传
def index(request):
if request.method == 'GET':
return render(request,'index.html')
else:
myfile = request.FILES.get('myfiles')
from django.core.files.uploadedfile import InMemoryUploadedFile
name = myfile.name
with open(name,'wb') as f:
for line in myfile:
f.write(line)
return HttpResponse('文件上传成功')
四、模板层
4.1、模板语法传值
变量相关使用:{{变量名}}
逻辑相关使用:{% %}
4.2、模板语法查询
使用的是“句点符”
django中的模板只能使用点的形式取值,可以使用.变量名、.索引的形式来取值
取出字典d里里面的bobby字典,bobby列表里面的第四个索引,第四个索引里面的key=info,对应的value
<p>{{d.bobby.3.info}}</p>
4.3、内置过滤器
django的内置过滤器有60多种,暂时只需要了解10种就够了
4.3.1、过滤器的基本语法
{{数据|过滤器:参数}}
4.3.2、过滤器的使用
<p>统计长度:{{s|length}}</p> #统计变量名为s的长度,并在页面中展示
<p>默认值:{{b|default:啥也不是}}</p> #default第一个参数为True则展示第一个参数后面的值,否则展示冒号后面的值,内部源码为or
<p>文件大小:{{file_size|filesizeformat}}</p>
<p>日期格式化:{{current_time|date:'Y-M-D H-I-S'}}</p>
<p>切片操作:{{l|slice:'0:4:2'}}</p>
<<p>切取字符(包含三个点):{{ info|truncatechars:9 }}</p>
<p>切取单词(不包含三个点 按照空格切):{{ egl|truncatewords:9 }}</p>
<p>切取单词(不包含三个点 按照空格切):{{ info|truncatewords:9 }}</p>
<p>移除特定的字符:{{ msg|cut:' ' }}</p>
<p>拼接操作:{{ l|join:'$' }}</p>
<p>拼接操作(加法):{{ n|add:10 }}</p>
<p>拼接操作(加法):{{ s|add:msg }}</p>
<p>转义:{{ hhh|safe }}</p>
<p>转义:{{ sss|safe }}</p>
<p>转义:{{ res }}</p>
4.3.3、转义
其中转义safe指的是:Django中将设置成默认取消转义,也就是当变量内部含有需要执行的条件时,是不会执行的,也就是相当于字符串的形式。要求转义的时候需要使用{{变量名|safe}}
转义是前后端分离的重要部分,可以在后端写完功能,然后传递到前端去,其中转义就决定了功能的实现
前端转义: 变量名|转义
后端转义: 需要先导入mark_safe
from django.utils.safestring import mark_safe
res = make_safe('<h1>哈哈</h1>')
4.4、标签
标签也就是逻辑相关的使用:{% %},逻辑主要就是for循环和if判断,可以和else以及elif搭配
4.4.1、for循环
{%for foo in l%}
<p>{{foo}}</p>
4.4.2、if判断
{%if b%}
<p>呵呵</p>
4.4.3、with起别名
with 可以在as后面为前面选择的进行取别名,后续可以快速的操作
{with d.bobby.3.info as nb}
<p>{{nb}}</p>
4.5、模板的导入和继承
4.5.1、模板的导入
模板的导入只需要直接使用include导入就行了
<% include 'index.html'%>
4.5.2、模板的继承
首先需要用extends确定一个要继承的模板,选择需要修改的区域,使用block content以及endblock确定范围,在文件内使用block content以及endblock之间填写需要修改的内容
模板页面至少可以有三个可以被修改的区域
{% extends 'home.html' %} 确定继承模板
{% block contends %}
页面内容,或者模板内容
{% endblock %} #HTML区域使用
{% block css %}
页面内容
{% endblock %} #css区域使用
{% block js %}
模板内容,划定区域
{% endblock %} #js区域使用
五、模型层
5.1、使用orm的步骤
orm使用的步骤有五步,分别是:
5.1.1、在setting中配置(连接数据库的地址,以及端口信息)
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'day64',
'USER':'ROOT',
'PASSWORD':'admin123',
'HOST':'127.0.0.1',
'POST':'3306'
}
}
5.1.2、在 init 中导入pymysql
import pymysql
pymysql.install_as_MySQLdb()
5.1.3、在models.py中写类,写属性
建立models模型,导入models模块,建立类,设定name和age,添加创建时间自由编写
from django.db import models
class User(models.model)
name = models.CharFiled(max_length = 32)
age = models.IntegerField()
register_time = models.daField()
5.1.4、使用数据库的迁移命令
连接数据库,现在pycharm中点击tool===》run...
在下面的执行窗口输入
Python3 manage.py makemigrations #记录
python3 manage.py migrate #真正的数据同步
5.1.5、在视图函数中使用orm
接着就可以在视图函数中使用orm了
5.2、orm中的api
Book.object.
1.all(): 查询所有结果
2.filter(): 筛选条件
3.get(): 返回相匹配的对象,只要不唯一就会报错
4.exclude(): 排除条件
5.ordel_by(): 对查询结果排序,(-id)为倒序
6.reverse(): 对查询结果反向排序,前提是已经使用order_by排序
7.count(): 查询数据库中对象的数量
8.first(): 返回第一条记录
9.last(): 返回最后一条记录
10、exists(): 如果QuerySet包含数据,就会返回True,否则返回False
11、values(): 得到的对象为字典类型
12、values_list(): 得到的对象为列表内包元组
13、destinct(): 从返回结果中去重
5.3、下划线查询
book.objects.filter()
price_in = [10,20,30] 筛选出列表中的数字
price_gt = 100 筛选出大于100的数字
price_it =100 筛选出小于100的数字
price_gte = 100 筛选出大于等于100的数字
price_ite = 100 筛选出小于等于100的数字
price_range = [100,200] 筛选出100到200的数字
title_contains = 'python' 模糊查询,带有python的,区分大小写
title_icontains = 'python' 模糊查询,带有python的,部分区分大小写
title_starswith = 'py' 查询开头带有py的
pub_date_year = 2012 查询时间为2012年的
5.4、删除
book.objects.filter().delete() 删除一条
queryset对象.delete() 删除多条
5.5、更新
book.objects.filter(title_startswith = 'py').update(price = 120)
5.6、增加
book.objexts.create(title = '呵呵',price=99)