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[0-9]{4})/$,views.year_archive),

​ 无名分组: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)
posted @ 2020-07-03 08:32  疏星淡月  阅读(167)  评论(0编辑  收藏  举报