专栏首页小闫笔记Django相关知识点回顾

Django相关知识点回顾

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

创建项目:

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 loader
temp = 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 pymysql
pymysql.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-migrate
python 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站点就可以进行图片上传

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

优质文章推荐:

公众号使用指南

redis操作命令总结

前端中那些让你头疼的英文单词

Flask框架重点知识总结回顾

项目重点知识点详解

难点理解&面试题问答

flask框架中的一些常见问题

团队开发注意事项

浅谈密码加密

Django框架中的英文单词

Django中数据库的相关操作

DRF框架中的英文单词

重点内容回顾-DRF

本文分享自微信公众号 - 全栈技术精选(Pythonnote)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 页面参数传递

    在doctor_ask.html页面,把在url中的参数取下来,要使用一个方法getQueryString(),其中有一个方法是用来获取url中含有中文参数的:

    一觉睡到小时候
  • HTTP 方法:GET方法 对比 POST方法

    Http请求中的get方法和post方法的异同,算是我们Web开发时候常见的问题吧,这次还是老生常谈,新壶装旧酒,权当复习了。

    浩Coding
  • Mybatis 动态 SQL

    Mybatis 动态SQL,通过 ●if ●choose (when, otherwise) ●trim (where, set) ●foreach ...

    赵哥窟
  • 用python的Django框架的内置User来做一个用户注册、登录、密码重置的应用

    写了几个简单的页面,突然想到这些页面需要注册并登录后的用户才可以观看该怎么实现呢?于是通过查找资料,做了一个简单的注册、登录、密码重置、密码找回的应用。

    小末快跑
  • 三种常用的结构化数据工具

    结构化数据工具,协助产生结构化数据标记辅助的工具,我们已经知道选择那种结构化数据标记,现在将介绍几种结构化数据工具,帮助创建和测试结构化数据标记。

    林雍岷
  • 用python的Django框架来做一个简单的web应用(三)

    在urls.py 中添加app_name='app_name'#app的名称。通过app_name加以区分。在html模板中可以调用<li><a href="{...

    小末快跑
  • 第61节:Java中的DOM和Javascript技术

    DOM是一门技术,是文档对象模型.所需的文档只有标记型文档,如我们所学的html文档(文档中的所有标签都封装成为对象了)

    达达前端
  • 骚操作!用Python把公众号文章打包成pdf文件,不再怕自己的劳动成果被丢失

    做自媒体的人,尤其是做了一年甚至更久的自媒体人,尤其是通过自媒体还有一些小收入的人,他们最怕自己的公众号内容因为各种原因而丢失,那就太可怕了! 在做自媒体内容上...

    JAVAandPython君
  • 用结构化数据自定义搜索结果摘要

    你听说过可以自定义搜索结果页摘要吗?此讲告诉你用结构化数据标志可以轻松自定义搜索结果页面的摘要,了解如何自定义谷歌搜索结果中显示的简要文本。在搜索结果中,谷歌将...

    林雍岷
  • 手动提交网址到搜索引擎不值钱

    手动提交网址到搜索引擎值得质疑,是否值得做,是否需要手动将你的网站提交给GOOGLE和BING。我可以明确地告诉你不需要将你的网站提交给搜索引擎,因为搜索引擎已...

    林雍岷

扫码关注云+社区

领取腾讯云代金券