正文共: 9847字 4图 预计阅读时间: 25分钟
每日分享
Develop success from failures. Discouragement and failure are two of the surest stepping stones to success.
从失败中获得成功。 沮丧和失败是成功的两个最可靠的垫脚石。
小闫语录:
有些人因为失败而一蹶不振,有些人却凭借失败积累的经验在后期获得成功。失败并不可怕,如果你连面对的勇气都没有,那么你真的不配成功。从失败中汲取教训,寻找失败的原因,为成功做铺垫。你比别人承受的更多,你最后获得的成果越丰硕。不要沮丧,不要畏惧,从第三者的角度看自己,你都会瞧不起自己。振作起来,厚积薄发,现在你所有的失败都是你成功之后,骄傲的谈资。
Django相关知识点回顾
1.web服务器和web框架
后端的服务器其实分为两部分,一部分是web服务器程序,一部分是web框架程序。两部分各司其职。我们结合后端服务器处理流程进行说明:
1.接收HTTP请求报文,web服务器进行解析,并调用框架程序处理请求。
2.web框架程序进行路由分发(根据url找到对应的处理函数)。
3.调用web框架程序的处理函数中进行业务的处理。
4.web服务器组织响应报文,返回内容给客户端。
2.项目创建
创建项目:
代码语言:javascript复制django-admin startproject 项目名
创建子应用:
代码语言:javascript复制python manage.py startapp 子应用
子应用首先到settings配置文件INSTALLED_APPS中进行注册。
2.1HelloWorld程序
2.1.1视图函数的定义
代码语言:javascript复制注意点:函数设置形参request接收请求对象;返回相应对象HttpResponse。
# /index
def index(request):
...
return HttpResponse('hello world')
2.1.2url地址配置
1.先在子应用中创建urls.py文件,设置当前子应用中url地址和视图的对应关系。
代码语言:javascript复制from django.conf.urls import url
from users import views
urlpatterns = [
# url('url正则表达式','对应视图函数')
url(r'^index/$', views.index),
]
2.在项目中总的urls.py文件中对子应用的urls文件进行包含。
代码语言:javascript复制urlpatterns = [
...
url(r'^', include('users.urls'))
]
在访问后端接口的时候,会先到总的urls文件中进行匹配子应用,匹配到后再到子应用中的urls文件中进行视图的匹配,匹配到后,返回响应。
4.djano框架特点
1.Django框架强调快速开发和DRY原则。
DRY=DoNotRepeatYourself不要重复的你自己做过的事情
2.Django是重量级框架,相对于Flask来说,很多功能组件不需要自己再进行安装。
2.1提供了项目工程管理自动化脚本工具(对应Flask中的flask-script),也就是我们可以启动服务器的时候通过命令行的方式进行传参。
2.2数据库ORM支持(对应Flask中的FlaskSQLAlchemy)
ORM是对象关系映射,就是将数据库的操作都转化成对类,属性和方法的操作,不用写sql语句了,不用关注你使用的是mysql还是Oracle等。
3.MVT模式(Model模型、View视图、Template模板)
5.URL配置
Django默认url配置风格是在末尾加 /
,在子应用中进行url地址配置的时候,建议严格匹配开头和结尾。
反解析使用
reverse('namespace:name')
name是在子应用进行url配置时指定配置项的name namespace是在项目总的urls中进行包含时指定的namespace
6.项目配置项
6.1BASE_DIR
BASE_DIR是Django项目根目录。
6.2语言时区本地化
代码语言:javascript复制LANGUAGE_CODE = 'zh-Hans' # 中文语言,也可以是'zh-hans'
TIME_ZONE = 'Asia/Shanghai' # 中国时间
6.3静态文件
STATICFILES_DIRS --> 设置静态文件存放的目录
STATIC_URL --> 设置访问静态文件的url地址的前缀
django框架仅仅在DEBUG=True的模式下提供静态文件
7.客户端向服务器传递参数的途径
7.1通过url地址传递参数
代码语言:javascript复制url(r'^weather/(?P<city>w )/(?P<year>d{4})/$', views.weather),
7.2通过查询字符串传递参数
代码语言:javascript复制# 演示从查询字符串中提取参数
# /query/?a=1&b=2&c=3&c=4
# flask: request.args
# django: reequest.GET -> QueryDict类的对象,类似于字典,和字典区别:允许一键多值
def query_data(request):
a = request.GET.get('a')
b = request.GET.get('b')
c = request.GET.get('c')
c_list = request.GET.getlist('c')
return HttpResponse('OK')
查询字符串不区分请求方式(get或者post请求方式都可以带查询字符串),即假使客户端进行POST方式请求,依然可以通过request.GET获取请求中的查询字符串数据。
7.3通过请求体传递数据
post表单提交,json数据,文件等等。
7.3.1post表单提交数据
代码语言:javascript复制# 演示获取post表单提交数据
# /form/
# flask: request.form
# django: requst.POST -> QueryDict类的对象,类似于字典,和字典的区别允许一键多值
def form_data(request):
name = request.POST.get('name')
age = request.POST.get('age')
return HttpResponse('OK')
7.3.2json数据
代码语言:javascript复制# 演示获取json数据
# /json/
# flask: request.json
def json_data(request):
req_data = request.body # 获取请求体中原始数据bytes
# 将bytes转换为str
json_str = req_data.decode()
# 将json字符串转换为python字典
req_dict = json.loads(json_str)
name = req_dict.get('name')
age = req_dict.get('age')
return HttpResponse('OK')
7.4通过请求头传递数据
代码语言:javascript复制request.META
7.5request对象的属性
Flask中request请求对象的属性 | Django中request请求对象的属性 | 说明 |
---|---|---|
args | GET | 查询字符串参数 |
form | POST | 请求体中的表单数据 |
data | body | 请求体中的原始bytes数据 |
method | method | 请求方式 |
path | path | 请求的url地址(不含域名) |
headers | META | 请求头 |
cookies | COOKIES | 客户端发送的cookie信息 |
files | FILES | 客户端上传的文件 |
8.响应对象构造
8.1返回HttpResponse类的对象或其子类的对象
代码语言:javascript复制response = HttpResponse('<响应体>', content_type='<响应数据类型>', status='<响应状态码>')
response['<key>'] = '<value>' # 设置响应头
8.2响应时返回json数据
代码语言:javascript复制# 演示响应时返回json数据
# /get_json/
# flask: jsonify
# Django: JsonResponse(<dict>)
def get_json(request):
res_dict = {
'name':'xiaohong',
'age':18
}
return JsonResponse(res_dict)
8.3响应时进行页面的重定向
代码语言:javascript复制# 演示响应时进行页面重定向
# /redirect_test/
# flask: redirect('重定向的url地址')
# django: redirect('重定向的url地址')
def redirect_test(request):
# 重定向到首页
req_url = reverse('users:index')
return redirect(req_url)
9.状态保持COOKIE和SESSION
9.1cookie
9.1.1特点
1.cookie数据保存在客户端,以key-value存储。
2.cookie有过期时间,默认是关闭浏览器过期。
3.cookie是基于域名安全的,浏览器在访问一个服务器的时候,只会把跟这个服务器相关的cookie发送过去。
9.1.2设置
flask:
代码语言:javascript复制response = make_response('响应内容')
response.set_cookie('<key>','<value>',max_age='<过期时间:s>')
django:
代码语言:javascript复制response = HttpResponse('响应内容')
response.set_cookie('<key>','<value>',max_age='<过期时间:s>')
9.1.3获取
flask:
代码语言:javascript复制request.cookies.get('<key>')
django:
代码语言:javascript复制request.COOKIES.get('<key>')
9.1.4删除
flask和django中操作一样。
代码语言:javascript复制response.delete_cookie('<key>')
9.2session
9.2.1特点
1.session数据保存在服务器,以key-value方式存储。
2.session依赖于cookie,每个客户端的session信息标识保存在客户端的cookie中。
3.session也有过期时间,flask开启session过期时间之后默认30天,Django中的session过期时间默认2周。
9.2.2设置
flask:
代码语言:javascript复制from flask import session
session['<key>'] = '<value>'
django:
代码语言:javascript复制request.session['<key>'] = '<value>'
9.2.3获取
flask:
代码语言:javascript复制session.get('<get>')
django:
代码语言:javascript复制request.session.get('<key>')
9.2.4Django中session
1.关系数据库(默认存储方式:django_session)
代码语言:javascript复制SESSION_ENGINE='django.contrib.sessions.backends.db'
2.缓存(Django框架缓存默认是服务器内存)
代码语言:javascript复制SESSION_ENGINE='django.contrib.sessions.backends.cache'
3.混合存储
代码语言:javascript复制SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
4.将session信息存储到redis中
需要安装扩展:
代码语言:javascript复制pip install django-redis
然后再配置中进行设置
代码语言:javascript复制# 设置Django框架的缓存位置(如果不做设置,缓存默认是服务器内存)
# 此处是要把Django框架的缓存改为redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# redis数据库地址设置
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 设置将django框架的session存储到缓存中,上面已经把django的缓存改为了redis,所以session就存储到了redis中
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 设置session存储到缓存空间的名称
SESSION_CACHE_ALIAS = "default"
以上内容详细介绍请看文章『我是个链接』
10.类视图
10.1使用
10.1.1定义类视图
代码语言:javascript复制# /register/
class RegisterView(View):
"""第一个类视图"""
def get(self, request):
return HttpResponse('返回注册页面')
def post(self, request):
return HttpResponse('进行注册处理')
def put(self, request):
return HttpResponse('put方法被调用')
10.1.2进行url配置
代码语言:javascript复制urlpatterns = [
url(r'^register/$', views.RegisterView.as_view()),
]
10.2添加装饰器
1.直接在url配置时手动调用装饰器函数来实现装饰器添加
代码语言:javascript复制urlpattern = [
url(r'^demo/$', my_cecorate(DemoView.as_view()))
]
2.使用Django框架提供的method_decorator,将针对函数视图装饰器,添加到类视图的方法上面。
代码语言:javascript复制# 为全部请求方法添加装饰器
@method_decorator(my_decorator,name='dispatch')
class DemoView(View):
...
# 为特定的请求方法添加装饰器
@method_decorator(my_decorator,name='get')
class DemoView(View):
def get(self, request):
...
...
11.中间件
中间件是全局的
11.1定义中间件
代码语言:javascript复制def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
11.2配置文件
在 MIDDLEWARE
中注册中间件
11.3多个中间件代码执行顺序
init部分代码和中间件的注册顺序相反;
before_request部分代码和中间件的注册顺序相同
after_request部分代码和中间件的注册顺序相反
以上内容详细介绍请看文章『我是个链接』
12.模板
12.1作用
渲染产生html页面内容,进行数据展示
12.2使用
flask:
代码语言:javascript复制render_template('模板文件名',<key>=<value>,...)
django:
1.设置模板目录:
代码语言:javascript复制TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 此处修改
...
},
]
2.使用:
代码语言:javascript复制render(requeest,'模板文件名',<字典>)
实例:
代码语言:javascript复制# /use_template/
class TemplateView(View):
def get(self, request):
# 使用模板
return render(request, 'temp.html', {'content':'hello'})
12.3使用模板详细步骤
1.加载模板:指定使用模板文件,获取模板对象。
代码语言:javascript复制from django.template import loader
temp = loader.get_template('模板文件名')
2.模板渲染:给模板文件传递变量,将模板文件中的变量进行替换,获取替换之后的html内容。
代码语言:javascript复制res_html = temp.render(字典)
3.创建相应对象。
代码语言:javascript复制return HttpResponse(res_html)
13.数据库
13.1ORM框架
作用:将模型类和数据表进行对应,通过面向对象的方式进行数据库的操作。
flask:SQLAlchemy
django:自带ORM框架,可以直接进行使用
13.2Django和Flask模板区别
13.2.1模板变量
{{ 模板变量 }}
a) Django使用模板变量时,无论是字典、列表或者元组的元素,都需要使用
.
取值,下标或者键名,不能使用[]
,这是和Flask有区别的地方。 b) Django中的模板变量不能直接进行算术运算。
13.2.2模板控制语句
13.2.2.1条件判断
a) Django模板在进行条件判断时,比较操作符两边必须有空格。
13.2.2.2for循环
代码语言:javascript复制b) Django模板中的for循环和jinja2模板中for循环对比。
# Jinja2模板中for循环
{% for ... in ... %}
# 遍历不为空时的逻辑
# 获取for循环遍历到了第几次
{{ loop.index }}
{% else %}
# 遍历为空时的逻辑
{% endfor %}
# Django模板中for循环
{% for ... in ... %}
# 遍历不为空时的逻辑
# 获取for循环遍历到了第几次
{{ forloop.couter }}
{% empty %}
# 遍历为空时的逻辑
{% endfor %}
13.2.3模板过滤器
代码语言:javascript复制a) Jinja2模板过滤器使用
{{ 模板变量|过滤器(参数...)}}
代码语言:javascript复制b) Django中模板过滤器的使用
{{ 模板变量|过滤器:参数 }}
注意:Django过滤器
:
之后只能接收一个参数
13.3步骤
13.3.1数据库连接配置
flask:
代码语言:javascript复制SQLAlCHEMY_DATABASE_URI='mysql://<username>:<password>@<host_ip>:<port>/<db>
django:
1.在settings.py进行配置
代码语言:javascript复制# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST':'127.0.0.1', # 数据库服务器IP
'PORT':3306, # 数据库服务器port
'USER':'root', # 用户名
'PASSWORD':'mysql', # 密码
'NAME':'django_demo' # 数据库名
}
}
2.安装pymysql
代码语言:javascript复制pip install pymysql
3.首次启动时需要在项目同名目录 __init__.py
添加
import pymysql
pymysql.install_as_MySQLdb()
13.3.2定义模型类
flask中定义模型类:
代码语言:javascript复制db = SQLAlchemy(app)
class User(db.model):
"""模型类"""
# 字段名 = db.Column(字段类型, 选项参数)
...
__tablename__ = '<表名>'
django中定义模型类:
代码语言:javascript复制class 模型类名(models.Model):
# 字段名 = models.字段类型(选项参数)
...
class Meta:
db_table = '<表名>'
定义外键属性:
代码语言:javascript复制# 表中外键字段名格式: <外键属性_id>
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE, verbose_name'图书')
13.3.3迁移生成数据表
flask:
代码语言:javascript复制flask-migrate
python manage.py db init# 生成迁移文件夹
python manage.py db migrate # 生成迁移文件
python manage.py db upgrade # 迁移
django:
代码语言:javascript复制# 生成迁移文件
python manage.py makemigrations
# 迁移生成表
python manage.py migrate
13.3.4通过模型类和对象进行数据库操作(增删改查)
新增
代码语言:javascript复制创建模型类对象--->对象.save()
注意:添加HeroInfo时,可以给hbook赋值,也可以直接表中hbook_id赋值
或者:
代码语言:javascript复制模型类.objects.create(...)
修改
代码语言:javascript复制查询对象->修改对象属性->对象.save()
或者:
代码语言:javascript复制模型类.objects.filter(...).update(...)
删除
代码语言:javascript复制查询对象->对象.delete()
或者:
代码语言:javascript复制模型类.objects.filter(...).delete()
查询
代码语言:javascript复制模型类.objects.查询函数
查询相关函数:
函数名称 | 参数 | 作用 | 返回值 |
---|---|---|---|
all | 无 | 查询模型类对应表格中的所有数据 | QuerySet(查询集) |
get | 查询条件 | 查询满足条件一条且只能有一条数据 | 模型类对象,查不到会报错DoesNotExist |
filter | 查询条件 | 返回满足条件的所有数据 | QuerySet(查询集) |
exclude | 查询条件 | 返回不满足条件的所有数据 | QuerySet(查询集) |
order_by | 排序字段 | 对查询结果进行排序 | QuerySet(查询集) |
aggregate | 聚合 | 查询时进行聚合操作 | 字典:{'属性名_聚合类小写':值} |
count | 无 | 返回查询结果的数目 | 数字 |
条件查询:
对应get,filter,exclude参数中可以写查询条件
代码语言:javascript复制格式:属性名__条件名 = 值
可以写多个查询条件,默认是且的关系
F对象:
用于查询时字段之间的比较
代码语言:javascript复制from django.db.models import F
Q对象:
用于查询时条件之间的逻辑关系
代码语言:javascript复制from django.db.models import Q
&(与) |(或) ~(非)
聚合类:
代码语言:javascript复制聚合类: from django.db.models import Count, Sum, Avg, Max, Min
使用aggregate()过滤器调用聚合函数
排序:
排序默认是升序,降序在排序字段前加-
使用order_by
关联查询:
1.查询和指定对象关联的数据
代码语言:javascript复制# 由1查多
一对象.多类名小写_set.all()
例:book.heroinfo_set.all()
# 由多查1
多对象.外键属性
例:hero.hbook
2.通过模型类进行关联查询
代码语言:javascript复制# 查图书(一)
一类.objects.get|filter(多类名__字段__条件=值)
例:books = BookInfo.objects.filter(heroinfo__hcomment__contains='八')
# 查英雄(多)
多类.objects.filter(外键属性__字段__条件=值)
例:heros = HeroInfo.objects.filter(hbook__bread__gt=30)
13.4QuerySet(查询集)
all,filter,exclude,order_by这4个函数返回的是查询集对象
特点
可以像list一样进行操作,可以遍历、取下标、进行切片,切片时下标不允许为负数。
注意:对于QuerySet类的对象,可以继续调用之前所讲任何一个查询函数。
例:查询id大于3的图书数量
代码语言:javascript复制BookInfo.objects.filter(id__gt=3).count()
exists:判断查询集中是否有数据
两大特性
惰性查询:
只有在使用查询集中的数据时才会进行数据库真正查询操作。
查询结果的缓存
使用同一个查询集时,只有在第一次使用查询集时会进行数据库的查询操作,然后Django框架就会把查询的结果存起来,下一次再使用这个查询集时,使用的Django之前存储的结果。
以上内容详细介绍请看文章『我是个链接』
14.Admin站点
Django自带文件存储系统,可以直接通过Admin站点进行图片的上传,默认上传的文件保存在服务器本地。
使用
1.在配置文件中设置配置项MEDIA_ROOT='上传文件的保存目录'
2.定义模型类时,图片字段的类型使用 ImageField
3.迁移生成表并在admin.py注册模型类,直接登录Admin站点就可以进行图片上传
以上内容详细介绍请看文章『我是个链接』
优质文章推荐:
公众号使用指南
redis操作命令总结
前端中那些让你头疼的英文单词
Flask框架重点知识总结回顾
项目重点知识点详解
难点理解&面试题问答
flask框架中的一些常见问题
团队开发注意事项
浅谈密码加密
Django框架中的英文单词
Django中数据库的相关操作
DRF框架中的英文单词
重点内容回顾-DRF