分享

Django相关知识点回顾

 正合叔 2019-10-31

正文共: 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.项目创建

创建项目:

  1. django-admin startproject 项目名

创建子应用:

  1. python manage.py startapp 子应用

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

2.1HelloWorld程序

2.1.1视图函数的定义

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

  1. # /index

  2. def index(request):

  3.    ...

  4.    return HttpResponse('hello world')

2.1.2url地址配置

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

  1. from django.conf.urls import url

  2. from users import views

  3. urlpatterns = [

  4.    # url('url正则表达式','对应视图函数')

  5.    url(r'^index/$', views.index),

  6. ]

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

  1. urlpatterns = [

  2.    ...

  3.    url(r'^', include('users.urls'))

  4. ]

在访问后端接口的时候,会先到总的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语言时区本地化

  1. LANGUAGE_CODE = 'zh-Hans' # 中文语言,也可以是'zh-hans'

  2. TIME_ZONE = 'Asia/Shanghai' # 中国时间

6.3静态文件

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

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

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

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

7.1通过url地址传递参数

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

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

  1. # 演示从查询字符串中提取参数

  2. # /query/?a=1&b=2&c=3&c=4

  3. # flask: request.args

  4. # django: reequest.GET -> QueryDict类的对象,类似于字典,和字典区别:允许一键多值

  5. def query_data(request):

  6.    a = request.GET.get('a')

  7.    b = request.GET.get('b')

  8.    c = request.GET.get('c')

  9.    c_list = request.GET.getlist('c')

  10.    return HttpResponse('OK')

查询字符串不区分请求方式(get或者post请求方式都可以带查询字符串),即假使客户端进行POST方式请求,依然可以通过request.GET获取请求中的查询字符串数据。

7.3通过请求体传递数据

post表单提交,json数据,文件等等。

7.3.1post表单提交数据

  1. # 演示获取post表单提交数据

  2. # /form/

  3. # flask: request.form

  4. # django: requst.POST -> QueryDict类的对象,类似于字典,和字典的区别允许一键多值

  5. def form_data(request):

  6.    name = request.POST.get('name')

  7.    age = request.POST.get('age')

  8.    return HttpResponse('OK')

7.3.2json数据

  1. # 演示获取json数据

  2. # /json/

  3. # flask: request.json

  4. def json_data(request):

  5.    req_data = request.body # 获取请求体中原始数据bytes

  6.    # 将bytes转换为str

  7.    json_str = req_data.decode()

  8.    # 将json字符串转换为python字典

  9.    req_dict = json.loads(json_str)

  10.    name = req_dict.get('name')

  11.    age = req_dict.get('age')

  12.    return HttpResponse('OK')

7.4通过请求头传递数据

  1. request.META

7.5request对象的属性

Flask中request请求对象的属性Django中request请求对象的属性说明
argsGET查询字符串参数
formPOST请求体中的表单数据
databody请求体中的原始bytes数据
methodmethod请求方式
pathpath请求的url地址(不含域名)
headersMETA请求头
cookiesCOOKIES客户端发送的cookie信息
filesFILES客户端上传的文件

8.响应对象构造

8.1返回HttpResponse类的对象或其子类的对象

  1. response = HttpResponse('<响应体>', content_type='<响应数据类型>',  status='<响应状态码>')

  2. response['<key>'] = '<value>' # 设置响应头

8.2响应时返回json数据

  1. # 演示响应时返回json数据

  2. # /get_json/

  3. # flask: jsonify

  4. # Django: JsonResponse(<dict>)

  5. def get_json(request):

  6.    res_dict = {

  7.        'name':'xiaohong',

  8.        'age':18

  9.    }

  10.    return JsonResponse(res_dict)

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

  1. # 演示响应时进行页面重定向

  2. # /redirect_test/

  3. # flask: redirect('重定向的url地址')

  4. # django: redirect('重定向的url地址')

  5. def redirect_test(request):

  6.    # 重定向到首页

  7.    req_url = reverse('users:index')

  8.    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

  1. response = make_response('响应内容')

  2. response.set_cookie('<key>','<value>',max_age='<过期时间:s>')

django:

  1. response = HttpResponse('响应内容')

  2. response.set_cookie('<key>','<value>',max_age='<过期时间:s>')

9.1.3获取

flask:

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

django:

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

9.1.4删除

flask和django中操作一样

  1. 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:

  1. from flask import session

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

django:

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

9.2.3获取

flask:

  1. session.get('<get>')

django:

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

9.2.4Django中session

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

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

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

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

3.混合存储

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

4.将session信息存储到redis中

需要安装扩展:

  1. pip install django-redis

然后再配置中进行设置

  1. # 设置Django框架的缓存位置(如果不做设置,缓存默认是服务器内存)

  2. # 此处是要把Django框架的缓存改为redis

  3. CACHES = {

  4.    'default': {

  5.        'BACKEND': 'django_redis.cache.RedisCache',

  6.        # redis数据库地址设置

  7.        'LOCATION': 'redis://127.0.0.1:6379/1',

  8.        'OPTIONS': {

  9.            'CLIENT_CLASS': 'django_redis.client.DefaultClient',

  10.        }

  11.    }

  12. }

  13. # 设置将django框架的session存储到缓存中,上面已经把django的缓存改为了redis,所以session就存储到了redis中

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

  15. # 设置session存储到缓存空间的名称

  16. SESSION_CACHE_ALIAS = 'default'

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


10.类视图

10.1使用

10.1.1定义类视图

  1. # /register/

  2. class RegisterView(View):

  3.    '''第一个类视图'''

  4.    def get(self, request):

  5.        return HttpResponse('返回注册页面')

  6.    def post(self, request):

  7.        return HttpResponse('进行注册处理')

  8.    def put(self, request):

  9.        return HttpResponse('put方法被调用')

10.1.2进行url配置

  1. urlpatterns = [

  2.    url(r'^register/$', views.RegisterView.as_view()),

  3. ]

10.2添加装饰器

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

  1. urlpattern = [

  2.    url(r'^demo/$', my_cecorate(DemoView.as_view()))

  3. ]

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

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

  2. @method_decorator(my_decorator,name='dispatch')

  3. class DemoView(View):

  4.    ...

  5. # 为特定的请求方法添加装饰器

  6. @method_decorator(my_decorator,name='get')

  7. class DemoView(View):

  8.    def get(self, request):

  9.        ...

  10.    ...

11.中间件

中间件是全局的

11.1定义中间件

  1. def simple_middleware(get_response):

  2.    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

  3.    def middleware(request):

  4.        # 此处编写的代码会在每个请求处理视图前被调用。

  5.        response = get_response(request)

  6.        # 此处编写的代码会在每个请求处理视图之后被调用。

  7.        return response

  8.    return middleware

11.2配置文件

在 MIDDLEWARE中注册中间件

11.3多个中间件代码执行顺序

init部分代码和中间件的注册顺序相反;

before_request部分代码和中间件的注册顺序相同

after_request部分代码和中间件的注册顺序相反

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


12.模板

12.1作用

渲染产生html页面内容,进行数据展示

12.2使用

flask

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

django

1.设置模板目录:

  1. TEMPLATES = [

  2.    {

  3.        ...

  4.        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 此处修改

  5.        ...

  6.    },

  7. ]

2.使用:

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

实例:

  1. # /use_template/

  2. class TemplateView(View):

  3.    def get(self, request):

  4.    # 使用模板

  5.    return render(request, 'temp.html', {'content':'hello'})

12.3使用模板详细步骤

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

  1. from django.template import loader

  2. temp = loader.get_template('模板文件名')

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

  1. res_html = temp.render(字典)

3.创建相应对象。

  1. 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循环对比。

  1. # Jinja2模板中for循环

  2. {% for ... in ... %}

  3.    # 遍历不为空时的逻辑

  4.    # 获取for循环遍历到了第几次

  5.    {{ loop.index }}

  6. {% else %}

  7.    # 遍历为空时的逻辑

  8. {% endfor %}

  9. # Django模板中for循环

  10. {% for ... in ... %}

  11.    # 遍历不为空时的逻辑

  12.    # 获取for循环遍历到了第几次

  13.    {{ forloop.couter }}

  14. {% empty %}

  15.    # 遍历为空时的逻辑

  16. {% endfor %}

13.2.3模板过滤器

a) Jinja2模板过滤器使用

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

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

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

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

13.3步骤

13.3.1数据库连接配置

flask

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

django:

1.在settings.py进行配置

  1. # 数据库配置

  2. DATABASES = {

  3.    'default': {

  4.        'ENGINE': 'django.db.backends.mysql',

  5.        'HOST':'127.0.0.1', #  数据库服务器IP

  6.        'PORT':3306, # 数据库服务器port

  7.        'USER':'root', # 用户名

  8.        'PASSWORD':'mysql', # 密码

  9.        'NAME':'django_demo' # 数据库名

  10.    }

  11. }

2.安装pymysql

  1. pip install pymysql

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

  1. import pymysql

  2. pymysql.install_as_MySQLdb()

13.3.2定义模型类

flask中定义模型类:

  1. db = SQLAlchemy(app)

  2. class User(db.model):

  3.    '''模型类'''

  4.    # 字段名 = db.Column(字段类型, 选项参数)

  5.    ...

  6.    __tablename__ = '<表名>'

django中定义模型类:

  1. class 模型类名(models.Model):

  2.    # 字段名 = models.字段类型(选项参数)

  3.    ...

  4.    class Meta:

  5.        db_table = '<表名>'

定义外键属性:

  1. # 表中外键字段名格式: <外键属性_id>

  2. hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE, verbose_name'图书')

13.3.3迁移生成数据表

flask:

  1. flask-migrate

  2. python manage.py db init# 生成迁移文件夹

  3. python manage.py db migrate # 生成迁移文件

  4. python manage.py db upgrade # 迁移

django:

  1. # 生成迁移文件

  2. python manage.py makemigrations

  3. # 迁移生成表

  4. python manage.py migrate

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

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

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

或者:

  1. 模型类.objects.create(...)

修改
  1. 查询对象->修改对象属性->对象.save()

或者:

  1. 模型类.objects.filter(...).update(...)

删除
  1. 查询对象->对象.delete()

或者:

  1. 模型类.objects.filter(...).delete()

查询
  1. 模型类.objects.查询函数

查询相关函数

函数名称参数作用返回值
all查询模型类对应表格中的所有数据QuerySet(查询集)
get查询条件查询满足条件一条且只能有一条数据模型类对象,查不到会报错DoesNotExist
filter查询条件返回满足条件的所有数据QuerySet(查询集)
exclude查询条件返回不满足条件的所有数据QuerySet(查询集)
order_by排序字段对查询结果进行排序QuerySet(查询集)
aggregate聚合查询时进行聚合操作字典:{'属性名_聚合类小写':值}
count返回查询结果的数目数字

条件查询

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

  1. 格式:属性名__条件名 =

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

F对象

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

  1. from django.db.models import F

Q对象

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

  1. from django.db.models import Q

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

聚合类

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

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

排序

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

使用order_by

关联查询

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

  1. # 由1查多

  2. 一对象.多类名小写_set.all()

  3. 例:book.heroinfo_set.all()

  4. # 由多查1

  5. 多对象.外键属性

  6. 例:hero.hbook

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

  1. # 查图书(一)

  2. 一类.objects.get|filter(多类名__字段__条件=值)

  3. 例:books = BookInfo.objects.filter(heroinfo__hcomment__contains='八')

  4. # 查英雄(多)

  5. 多类.objects.filter(外键属性__字段__条件=值)

  6. 例:heros = HeroInfo.objects.filter(hbook__bread__gt=30)

13.4QuerySet(查询集)

all,filter,exclude,order_by这4个函数返回的是查询集对象

特点

可以像list一样进行操作,可以遍历、取下标、进行切片,切片时下标不允许为负数。

注意:对于QuerySet类的对象,可以继续调用之前所讲任何一个查询函数。

例:查询id大于3的图书数量

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

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

两大特性

惰性查询

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

查询结果的缓存

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

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


14.Admin站点

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

使用

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

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多