一、Python Web框架

1.Web应用程序处理流程

说明:1.首先浏览器给Web服务器发送HTTP请求。2.服务器接收到请求后解析请求,然后发送给Web后端框架。3.后端框架接收到请求后进行处理(如封装js、数据库交互、业务处理等操作)。4.处理结束后把HTTP的响应对象返回给服务器。5.服务器把接收到的HTTP响应对象报文最后返回给浏览器。6.最终浏览器得到想要的页面。

2.Web程序框架的意义

  • 用于搭建Web应用程序
  • 避免代码重复编写,只需要关心Web应用核心的业务逻辑实现

3.Web应用程序的本质

  • 接受并解析HTTP请求,获取具体的请求信息
  • 处理本次HTTP请求,即完成业务逻辑处理
  • 构造并返回处理结果——HTTP响应

4.Web框架的流程

  • 1.搭建工程程序

    • 工程的搭建
    • 工程的配置
    • 路由定义
    • 视图函数定义
  • 2.操作request对象
  • 3.构造response对象
  • 4.使用中间层、模板、数据库等

二、Django框架

1.django框架的介绍

Django,发音类似于(粘构)。是用python语言编写的开源web开发框架,并遵循MVC设计模式。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有很多功能强大的第三方插件,也可以开发出自己的工具包。使得Django有很强的可扩展性,它还强调快速开发和DRY原则。

2.Django的特点

1)重量级框架

  • 提供项目工程管理的自动化脚本工具

  • 数据库ORM支持(对象关系映射)

  • 模板

  • 表单

  • Admin管理站点

  • 文件管理

  • 认证权限

  • session机制

  • 缓存

    2)MVT设计模式

  • 先来了解一下另一种设计模式MVC,其核心思想是分工、解耦,让不同的代码之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。

  • MVC模式的图解

  • M为Model,主要是对数据库的交互,对数据库中的数据进行增删改查操作

  • V为View,主要是用于封装,来生成展示给浏览器的html用户

  • C为Controll,主要是用于接受请求,处理业务逻辑,返回结果,与Model和View交互调度

    3)Django使用的是MVT设计模式

  • 其MVT设计模式是在MVC模式发展而来的

  • M为Model,与MVC中的M功能相同
  • V为View,与MVC中的C的功能相同
  • T为Template,与MVC中的V功能相同

三、工程搭建

1.创建虚拟环境(所有安装包的过程都需要联网)

mkvirtualenv 虚拟环境名字 -p python3
例:
mkvirtualenv django_env - p python3

2.安装Django包

进入虚拟环境后输入:
pip3 install django==1.11.11
安装完成后输入pip3 list查看一下是否存在django1.11.11

3.相关命令

# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 查看所有虚拟环境和切换虚拟环境
deactivate # 退出当前虚拟环境
# pip3
pip3 install # 联网安装包
pip3 unstall # 卸载安装包
pip3 list # 查看安装包

4.创建工程

  • 1.创建工程

    django-admin startproject 工程名字
    例:
    django-admin startproject zdemo
    # 这个工程会创建在当前目录下,所以想要在那个目录下创建工程就先到那个目录下,或者加上路径。
    
  • 2.工程目录说明

    cd zdemo # 进入工程目录
    tree  # 即可查看当前工程中的目录信息
    

    说明:

    • 与项目同名的目录是工程文件
    • settings.py是项目整体的配置文件
    • urls.py是项目的路由配置文件
    • wsgi.py是项目与WSGI协议兼容的Web服务器入口
    • manage.py是项目的管理文件

    3.运行开发服务器

    在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅供在开发阶段使用。

    运行服务器的命令如下:

    python3 manage.py runserver ip:端口  # ip和端口号可以不写,默认是127.0.0.1 和 8000
    

    4.验证

    此时在浏览器输入127.0.0.1:8000便可以看到效果

5.创建项目的子应用

在web应用中,通常有一些业务逻辑功能模块是在不同的项目中都可以用到的,所以在开发的过程中通常将项目拆分为不同的子功能模块,各功能模块间保持相对的独立,在其他工程项目中需要用到某个特定给功能的模块时,可以将该模块代码整体复制过去,达到复用。

Django的视图编写也是放在子应用中的

  • 1.创建子应用

    python3 manage.py startapp 子应用名称
    例:
    python3 manage.py startapp params
    # 需要先进入的工程目录下再进行创建子应用
    

    执行后,可以看到工程目录中多了一名为params的子目录

  • 2.子应用目录说明

    • admin.py文件是网站的后台管理站点的配置文件
    • apps.py文件是配置当前子应用的相关信息
    • migrations是用于存放数据库迁移历史文件
    • models.py是用于保存数据库模型类
    • tests.py文件是用于开发测试的
    • views.py文件是编写Web应用视图函数
  • 3.注册安装子应用

    创建出来的子应用目录虽然被放到了工程项目目录中,但是django工程不能立即直接使用该子应用,需要在注册安装后才能使用。

    在工程配置文件settings.py中,INSTALLED_APPS保存了工程已经注册安装的子应用。

    • 此时需要将子应用的配置文件信息apps.py中的Config类添加到这个列表中。
    • 例如,将刚创建的params子应用添加到工程中,可以在INSTALLED_APPS列表中添加:
    • ‘params.apps.ParamsConfig’

6.创建视图

视图是用来编写web应用的业务逻辑。Django的视图是定义在子应用views.py中的

  • 1.创建视图

    打开刚创建的params模块,在views.py中编写视图代码

    from django.http import HttpResponsedef index(request):return HttpResponse("好久不见..")

    说明:

    • 视图函数的第一个参数必须定义,用于接受Django构造的包含了请求数据的HttpRequest对象,通常名为request
    • 视图函数的返回值必须为一个响应对象,不可以想Flash一样直接返回一个字符串,可以将要返回的字符串都放入HttpResponse对象中
  • 2.定义路由URL

    • 1)在子应用中创建一个urls.py的文件用于保存该应用的路由(可从主路由中复制)

    • 2)在params/urls.py文件中定义路由信息

      from django.conf.urls import url
      from . imrpot viewsurlpatterns = {# 添加url(r'^login/$', views.index),
      }
  • 3.在工程总路由zdemo/urls.py中添加子应用的路由

    from django.conf.urls import urls, include
    from django.contirb import adminurlpatterns = [url(r'^admin/', admin.site.urls), # django默认的# 添加url(r'^users', include('params.urls')),]

    说明:

    • 使用include来将子应用params里的全部路由包含进工程路由中
    • r’^users’决定了params的子应用的所有路由都/users/开头,如我们刚才定义的视图login,最终访问的时候的完整路径为/users/login/。
  • 4.启动运行测试

    python manage.py runserver

    在浏览器中输入127.0.0.1:8000/users/login/

7.配置文件

settings.py配置文件中的主要内容描述

    1. BASE_DIR

      表示当前工程的根目录,Django会以此来定位工程内的相关文件,我们也可以通过使用该参数来构造文件路径

    2. DEBUG

      调试模式,创建工程后初始值为True,也就是说默认工作在调试模式下

      作用:

      • Django程序出现异常的时候,向前端显示详细的错误追踪信息

      注:部署线上运行的Django不要运行在调试模式下,记得在配置文件中修改DEBUG=False

    3. 本地语言和时区

      初始化的工程语言和时区默认为英语和UTC标准时区

      将语言和时区改为中国信息

      LANGUAGE_CODE = ‘zh-hans’

      TIME_ZONE = ‘Asia/Shanghai’

8.静态文件

项目中的CSS、图片、js都是静态文件。一般会将静态文件放在一个单独的目录中,以方便管理。在html页面中调试时,也需要指定静态文件的路径,Django中提供了一种解析方式配置静态文件路径。静态文件可以放在项目的根目录下,也可以放在应用的目录下,不过有些静态文件在项目中的通用的,所以推荐放在项目的根目录下,方便复用和管理。

为了提供静态文件,需要配置两个参数:

  • STATICFILES_DIRS=[]存放查找静态文件的目录,接受的是list
  • 例如查找当前项目工程中的static_img静态文件需要设置:
  • STATICFILES_DIRS=[os.path.join(BASE_DIR,‘statc_img’)]
  • STATIC_URL 默认存在,不需要更改

注意:

  • 仅在调试模式下能对外提供静态文件

9.路由说明

1.路由定义位置

Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。

每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存子应用的路由。然后主路由文件中包含各个子应用的子路由数据。

2.路由解析顺序

Django在接收到一个请求时,从主路由文件中的urlpatterns列表中由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下的进行查询。

值得关注的是由上至下的顺序查询,有可能会使上面的路由屏蔽掉下面的路由,带来非预期的效果。例如:

urlpatterns = [url(r'^say', views.say),url(r'^sayhello', views.sayhello),
]

即使访问sayhello/路径,预期应该进入sayhello视图执行,但实际优先查找到了say路由规则也与sayhello/路径匹配,实际进入了say视图执行。

路由屏蔽主要有三个原因:

  • 路由列表由上至下进行查找
  • 正则匹配默认匹配一个就结束
  • 路由路径没有写$结尾

3.路由命名与reverse逆序解析

1)路由命名

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

在使用include函数定义路由时,可以使用namespace定义路由的命名空间,如

url(r'^users', include('params.urls', namespace = 'zhuluyou')),

命名空间表示,凡是params.urls中定义的路由,均属于namespace指明的zhuluyou名下。

命名空间的作用:避免不同子应用中的路由使用了相同名字发生冲突,使用命名空间区别开。

2)在定义普通路由的时候,可以使用name参数指明路由的名字,如

url(r'^login',views.index,name='ziluyou1'),
url(r'^login11',views.index11,name='ziluyou2'),

3)reverse逆向解析

需要使用reserver函数,根据路由名称,返回具体的路径,如

from django.urls import reverse
def index(request):url_path = reverse("zhuluyou:ziluyou1") # 返回/users/login

说明:

  • 对于未指明namespace的,reverse(“name”)
  • 对于指明namespace的,reverse(“namespace:name”)

4)路由结尾斜线 / 的说明

Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时候,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404,如

urlpatterns = [url(r'^index/$',views.index,name = 'index'),
]
# 用户访问index或者index/网址均能访问到index视图

四、请求Request参数

1.URL路径参数

在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数。

  • 命名参数按名字传递,如

    url(r'^weather/(?P<city>\w+)/(?P<year>\d{4})/$',views.weather),def weather(request, year ,city):print("city = %s" % city)print("year = %s" % year)return HttpResponse("这是路径传参的网页!")

2.查询参数

获取请求路径中的查询字符串参数(如?k1=v1&k2=v2)可以通过request.GET属性获取。返回QueryDict对象。

def chaxun(request):a = request.GET.get('a')b = reuqest.GET.get('b')alist = requqest.GET.getlist('a')print(a)   print(b)print(alist)return HttpResponse("这是查询传参的网页!")

注意:查询字符串不区分请求方式,即使客户端使用POST方式请求,依然可以通过request.GET方式获取参数

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

与python字典不一样,QueryDict类型的对象用来处理一键之值的情况

  • 方法get():根据键获取值

    如果一个键有多个值,那将获取最后一个值

    如果键不存在则返回None,但可以设置默认值

    dict.get('键',默认值)
    # 可简写为
    dict['键']
  • 方法getlist():根据键获取值,值以列表的方式返回。可以获取指定键的所有值

    如果键不存在则返回空列表[],也可以设置默认值

    dict.getlist('键',默认值)

3.请求体参数

请求体参数分为表单和非表单

请求体数据格式不固定,可以是表单类型的字符串,也可以是JSON字符串,XML字符串,应该区别对待。

可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试的时候可以关闭CSRF防护机制。

注释掉图中的中间行。

1)表单类型Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象

def biaodan(requqest):a = request.POST.get('a')b = request.POST.get('b')alist = request.POST.getlist('a')print(a)print(b)print(alist)return HttpResponse("这是表单类型传参的请求体数据网页!")

注意:request.POST只能用来获取POST方式请求的表单数据

2)非表单类型Non-Form Data

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性来获取最原始的请求体数据,返回bytes类型

def feibiaodan(requqest):# 先将非表单的请求体数据转换为原始数据json_str = request.body# 然后再解码json_str = requqest.decode()# 再将字符类型转换为字典类型import jsonjson_dict = json.loads(json_str)print(json_dict)return HttpResponse("这是非表单类型的请求体数据网页!")

说明:此时的json_dict是字典类型,所以可以自行操作。

4.请求头参数

可以通过reuqest.META属性来获取请求头headers中的数据,request.META为字典类型

常见的请求头如下:

CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).

具体使用:

def requqest_headers(requqest):content_length = request.META["CONTENT_LENGTH"]HTTP_ACCEPT = request.META["HTTP_ACCEPT"]zidingyi = request.META.get("HTTP_zidingyi")return HttpResponse("这是测试请求头参数的网页!")

5.了解其他HttpRequest对象属性

  • method:一个字符串,表示请求使用的HTTP,常用:‘GET’,‘POST‘。
  • user:请求的用户对象
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分
  • encoding:一个字符串,表示提交的数据的编码模式,一般默认为utf-8
  • FILES:一个类似于字典的对象,包含所有的上传文件

五、响应对象操作response

视图在接受请求并处理后,必须返回HttpResponse对象或者子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

1.HttpResponse

可以使用django.http.HttpResponse来构造响应对象

HttpResponse(content = 响应体,content_type=响应体数据类型,status=状态码)

也可以通过HttpResponse对象属性来设置响应体、状态吗

  • content:表示返回的内容
  • status_code:表示返回的HTTP响应状态码
  • 响应对象[‘key’] = value:表示设置给属性赋值
from django.http import HttpResponse# 通过参数返回
def res_header(request):return HttpResponse(content="响应体的内容网页",content_type="text/html; charset=utf-8",status=521)
# 通过属性设置
def res_header(request):# 设置响应对象response = HttpResponse("这是响应体测试的网页!")response["Iamheader"] = "response_header"response.content="这这个才是最后显示在网页中的内容!会把之前的覆盖!"response.status_code= 500return response

2.HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500

3.JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 1.帮助我们将数据转换为json字符串
  • 2.设置响应头Content-Type = application/json
from django.http import JsonResponsedef jsonR(request):dict_data = {"name":"wtt","age",22,"address":"fux"}return JsonResponse(dict_data)

4.rediect重定向

比如我们输入www.baidu.com 会自动重定位到https://www.baidu.com/ 这个过程就是重定向

from django.shortcuts import redirectdef Redirect(request):# 为了正确性所以这里使用reverse先转换为路径url_path = reverse("namespace:name")# 使用重定向return redirect(url_path)

说明:当用户输入网址调用到Redirect函数时候会重定向到reverse中所指明的路径

Django框架(一)相关推荐

  1. Django框架之第二篇

    Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...

  2. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  3. Python技术学习之Django框架设计思想

    Python是目前比较流行的计算机编程语言,据用丰富和强大的库,被称为胶水语言,能够把用其他语言制作的各种模块很轻松地联结在一起. Python功能强大,用途广泛,可广泛应用于云计算.web开发.科学 ...

  4. django框架使用mysql报错,及两种解决方法

    1.django框架 settings.py文件中部分代码: DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# ...

  5. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  6. Python3搭建Django框架浅析

    前言 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django 是一个开放源代码的 Web 应用框架,由 Pyt ...

  7. Django框架学习索引

    索引目录 1.Django介绍与安装 2.Django流程及模式 3.Django基本配置 4.Django模板(Templages) 1.Django的介绍和安装 3.Django框架模式 4.数据 ...

  8. Django 框架入门篇(安装与创建项目)

    什么是Django框架? 官方定义:Django是一个高级Python Web框架,鼓励快速开发和简洁实用的设计.它由经验丰富的开发人员构建,可以解决大部分Web开发的麻烦,因此您可以专注于编写应用程 ...

  9. 第九章 Django框架——csrf请求伪造和csrf_token使用

    第九章 Django框架--csrf请求伪造和csrf_token使用 一.csrf请求伪造 二.csrf_token使用 三.简单的csrf_token应用 四.Ajax使用csrf_token 一 ...

  10. Python Django框架入门第一课

    Python Django框架入门 1.Django简介 Django使用python开发的一个免费的Web框架,几乎囊括了Web应用的方方面面,用于快速搭建高性能.优雅的网站. 2.配Django运 ...

最新文章

  1. [Head First设计模式]生活中学设计模式——迭代器模式
  2. 嵌入式成长轨迹54 【Zigbee项目】【CC2430基础实验】【系统睡眠工作状态】
  3. Flask入门到放弃(四)—— 数据库
  4. P1852-跳跳棋【思维,差分,二分】
  5. Python面试题大全(一):基础知识学习
  6. IntelliJ IDEA这样配置,代码效率嗖嗖的
  7. vue cli 4 多环境_Vue 笔记整理19
  8. gulp启动项目报错
  9. C++中对字符串操作
  10. Git bash使用中...
  11. NSIS打包工具用法介绍与NSIS相关软件下载
  12. 逻辑漏洞(基本概念、爆破)
  13. 补充netty权威指南学习自定义协议实现,与springboot集成
  14. Linux远程拷贝文件命令 - scp
  15. 探索另类圆环图的做法
  16. MAC chrome 谷歌浏览器全屏显示——隐藏菜单栏
  17. 为什么程序员话少钱多死得早?一位人生悲惨的程序员与你讲述其中原因
  18. maven项目编译中文乱码和myeclipse中文乱码和电脑乱码?
  19. 印度的软件神话真不能打破吗?
  20. LeetCode hot-100 简单and中等难度,91-100.

热门文章

  1. 电脑感叹号,电脑网络出现感叹号怎么解决?Win7系统网络出现感叹号的解决方法...
  2. [附源码]计算机毕业设计springboot基于Web的软考题库平台
  3. element ui字段_ui备忘单下拉字段
  4. Windows AMD 安装 PyTorch
  5. android 读写文件 简书,Android 读取asset文件
  6. 能领取拼多多优惠券的微信小程序
  7. 编程题--疯狂序列----京东大数据笔试
  8. 手机投影到deepin
  9. Driving E-ink display
  10. win2016开启ntp_WindowsServer2016NTP服务端和客户端配置【NTP时间同步服务器】