正文共: 9847字 4图

预计阅读时间: 25分钟

Django相关知识点回顾_flask

每日分享

Develop success from failures. Discouragement and failure are two of the surest stepping stones to success.

从失败中获得成功。 沮丧和失败是成功的两个最可靠的垫脚石。

小闫语录​:

有些人因为失败而一蹶不振,有些人却凭借失败积累的经验在后期获得成功。失败并不可怕,如果你连面对的勇气都没有,那么你真的不配成功。从失败中汲取教训,寻找失败的原因,为成功做铺垫。你比别人承受的更多,你最后获得的成果越丰硕。不要沮丧,不要畏惧,从第三者的角度看自己,你都会瞧不起自己。振作起来,厚积薄发,现在你所有的失败都是你成功之后,骄傲的谈资。


Django相关知识点回顾_flask_02


Django相关知识点回顾

1.web服务器和web框架

后端的服务器其实分为两部分,一部分是web服务器程序,一部分是web框架程序。两部分各司其职。我们结合后端服务器处理流程进行说明:

1.接收HTTP请求报文,​web服务器​进行解析,并调用框架程序处理请求。

2.​web框架程序​进行路由分发(根据url找到对应的处理函数)。

3.调用​web框架程序​的处理函数中进行业务的处理。

4.​web服务器​组织响应报文,返回内容给客户端。

2.项目创建

创建项目:

django-admin startproject 项目名

创建子应用:

python manage.py startapp 子应用

子应用首先到settings配置文件INSTALLED_APPS中进行注册。

2.1HelloWorld程序

2.1.1视图函数的定义

注意点:函数设置形参request接收请求对象;返回相应对象HttpResponse。

# /index
def index(request):
...
return HttpResponse('hello world')

2.1.2url地址配置

1.先在子应用中创建urls.py文件,设置当前子应用中url地址和视图的对应关系。

from django.conf.urls import url
from users import views
urlpatterns = [
# url('url正则表达式','对应视图函数')
url(r'^index/$', views.index),
]

2.在项目中总的urls.py文件中对子应用的urls文件进行包含。

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语言时区本地化

LANGUAGE_CODE = 'zh-Hans' # 中文语言,也可以是'zh-hans'
TIME_ZONE = 'Asia/Shanghai' # 中国时间

6.3静态文件

STATICFILES_DIRS --> 设置静态文件存放的目录

STATIC_URL --> 设置访问静态文件的url地址的前缀

django框架仅仅在DEBUG=True的模式下提供静态文件

7.客户端向服务器传递参数的途径

7.1通过url地址传递参数

url(r'^weather/(?P<city>\w+)/(?P<year>\d{4})/$', views.weather),

7.2通过查询字符串传递参数

# 演示从查询字符串中提取参数
# /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表单提交数据

# 演示获取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数据

# 演示获取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通过请求头传递数据

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类的对象或其子类的对象

response = HttpResponse('<响应体>', content_type='<响应数据类型>',  status='<响应状态码>')
response['<key>'] = '<value>' # 设置响应头

8.2响应时返回json数据

# 演示响应时返回json数据
# /get_json/
# flask: jsonify
# Django: JsonResponse(<dict>)
def get_json(request):
res_dict = {
'name':'xiaohong',
'age':18
}
return JsonResponse(res_dict)

8.3响应时进行页面的重定向

# 演示响应时进行页面重定向
# /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​:

response = make_response('响应内容')
response.set_cookie('<key>','<value>',max_age='<过期时间:s>')

django​:

response = HttpResponse('响应内容')
response.set_cookie('<key>','<value>',max_age='<过期时间:s>')

9.1.3获取

flask​:

request.cookies.get('<key>')

django​:

request.COOKIES.get('<key>')

9.1.4删除

flask和django中操作一样​。

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​:

from flask import session
session['<key>'] = '<value>'

django​:

request.session['<key>'] = '<value>'

9.2.3获取

flask​:

session.get('<get>')

django​:

request.session.get('<key>')

9.2.4Django中session

1.关系数据库(默认存储方式:django_session)

SESSION_ENGINE='django.contrib.sessions.backends.db'

2.缓存(​Django框架缓存默认是服务器内存​)

SESSION_ENGINE='django.contrib.sessions.backends.cache'

3.混合存储

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

4.将session信息存储到redis中

需要安装扩展:

pip install django-redis

然后再配置中进行设置

# 设置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定义类视图

# /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配置

urlpatterns = [
url(r'^register/$', views.RegisterView.as_view()),
]

10.2添加装饰器

1.直接在url配置时手动调用装饰器函数来实现装饰器添加

urlpattern = [
url(r'^demo/$', my_cecorate(DemoView.as_view()))
]

2.使用Django框架提供的method_decorator,将针对函数视图装饰器,添加到类视图的方法上面。

# 为全部请求方法添加装饰器

@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定义中间件

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​:

render_template('模板文件名',<key>=<value>,...)

django​:

1.设置模板目录:

TEMPLATES = [    {        ...        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 此处修改        ...    },]

2.使用:

render(requeest,'模板文件名',<字典>)

实例:

# /use_template/class TemplateView(View):    def get(self, request):    # 使用模板    return render(request, 'temp.html', {'content':'hello'})

12.3使用模板详细步骤

1.加载模板:指定使用模板文件,获取模板对象。

from django.template import loadertemp = loader.get_template('模板文件名')

2.模板渲染:给模板文件传递变量,将模板文件中的变量进行替换,获取替换之后的html内容。

res_html = temp.render(字典)

3.创建相应对象。

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循环

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模板过滤器

a) Jinja2模板过滤器使用

{{ 模板变量|过滤器(参数...)}}

b) Django中模板过滤器的使用

{{ 模板变量|过滤器:参数 }}

注意:Django过滤器 ​:​之后只能接收一个参数

13.3步骤

13.3.1数据库连接配置

flask​:

SQLAlCHEMY_DATABASE_URI='mysql://<username>:<password>@<host_ip>:<port>/<db>

django​:

1.在settings.py进行配置

# 数据库配置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

pip install pymysql

3.首次启动时需要在项目同名目录 ​__init__.py​添加

import pymysqlpymysql.install_as_MySQLdb()

13.3.2定义模型类

flask中定义模型类​:

db = SQLAlchemy(app)class User(db.model):    """模型类"""    # 字段名 = db.Column(字段类型, 选项参数)    ...    __tablename__ = '<表名>'

django中定义模型类​:

class 模型类名(models.Model):    # 字段名 = models.字段类型(选项参数)    ...    class Meta:        db_table = '<表名>'

定义外键属性:

# 表中外键字段名格式: <外键属性_id>hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE, verbose_name'图书')

13.3.3迁移生成数据表

flask​:

flask-migratepython manage.py db init# 生成迁移文件夹python manage.py db migrate # 生成迁移文件python manage.py db upgrade # 迁移

django​:

# 生成迁移文件python manage.py makemigrations# 迁移生成表python manage.py migrate

13.3.4通过模型类和对象进行数据库操作(增删改查)

新增
创建模型类对象--->对象.save()

注意:添加HeroInfo时,可以给hbook赋值,也可以直接表中hbook_id赋值

或者:

模型类.objects.create(...)
修改
查询对象->修改对象属性->对象.save()

或者:

模型类.objects.filter(...).update(...)
删除
查询对象->对象.delete()

或者:

模型类.objects.filter(...).delete()
查询
模型类.objects.查询函数

查询相关函数​:


函数名称

参数

作用

返回值

all

查询模型类对应表格中的所有数据

QuerySet(查询集)

get

查询条件

查询满足条件一条且只能有一条数据

模型类对象,查不到会报错DoesNotExist

filter

查询条件

返回满足条件的所有数据

QuerySet(查询集)

exclude

查询条件

返回不满足条件的所有数据

QuerySet(查询集)

order_by

排序字段

对查询结果进行排序

QuerySet(查询集)

aggregate

聚合

查询时进行聚合操作

字典:{'属性名_聚合类小写':值}

count

返回查询结果的数目

数字


条件查询​:

对应get,filter,exclude参数中可以写查询条件

格式:属性名__条件名 = 值

可以写多个查询条件,默认是且的关系

F对象​:

用于查询时字段之间的比较

from django.db.models import F

Q对象​:

用于查询时条件之间的逻辑关系

from django.db.models import Q

&(与) |(或) ~(非)

聚合类​:

聚合类: from django.db.models import Count, Sum, Avg, Max, Min

使用aggregate()过滤器调用聚合函数

排序​:

排序默认是升序,降序在排序字段前加-

使用order_by

关联查询​:

1.查询和指定对象关联的数据

# 由1查多一对象.多类名小写_set.all()例:book.heroinfo_set.all()# 由多查1多对象.外键属性例:hero.hbook

2.通过模型类进行关联查询

# 查图书(一)一类.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的图书数量

BookInfo.objects.filter(id__gt=3).count()

exists:判断查询集中是否有数据

两大特性

惰性查询​:

只有在使用查询集中的数据时才会进行数据库真正查询操作。

查询结果的缓存

使用同一个查询集时,只有在第一次使用查询集时会进行数据库的查询操作,然后Django框架就会把查询的结果存起来,下一次再使用这个查询集时,使用的Django之前存储的结果。

以上内容详细介绍请看文章『​​我是个链接​​』


14.Admin站点

Django自带文件存储系统,可以直接通过Admin站点进行图片的上传,默认上传的文件保存在服务器本地。

使用

1.在配置文件中设置配置项MEDIA_ROOT='上传文件的保存目录'

2.定义模型类时,图片字段的类型使用 ​ImageField

3.迁移生成表并在admin.py注册模型类,直接登录Admin站点就可以进行图片上传

以上内容详细介绍请看文章『​​我是个链接​​』

Django相关知识点回顾_django_03