1.Django框架的学习笔记 (第一天)
1.理解django框架
django框架是一个重量级的框架,提供了丰富的模块,而且易于维护,扩展.首先我们来分析,django的主要组成部分.
1.1自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站。
1.2经过十多年的发展和完善,Django有广泛的实践案例和完善的在线文档。开发者遇到问题时可以搜索在线文档寻求解决方案。
1.3Django的Model层自带数据库ORM组件,使得开发者无须学习SQL语言即可对数据库进行操作。
1.4App是可插拔的,是不可多得的思想。不需要了,可以直接删除,对系统整体影响不大。
1.5.自带台管理系统admin,只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台。
1.6.Django debug信息详尽: 代码错误提示详细,易于定位修改。
- 基本配置(加粗部分为重要的组成部分)
- 路由系统 (当浏览器有请求的url过来的时候 ,后端的Django交给谁处理)
- 原生HTML模板系统 (返回给浏览器显示的HTML页面包含数据)
- 视图 view ( 路由系统,将路由与视图函数匹配,由视图函数处理相关业务,通常从Module中获取数据,填充到页面,并返回给浏览器).
- Model模型,数据库连接和ORM数据库管理 ( Modle通过ORM和数据库通信)
- 中间件 ( 后面会详细介绍)
- Cookie & Seesion(维持http状态,day05详细介绍 )
- 分页
- 数据库后台管理系统admin
-
Django 可以实现那些业务
1.网站后端开发
2.微信公众号,微信小程序后端开发
3.基于HTTP/HTTPS的后台开发服务
- 在线语音/图像开发服务器
- 在线第三方身份验证服务器等;
上述内容只是一些概念问题,学的时候比较枯燥,如果有一些基础的话话可以略过,(后面要放大招了)*3,准备好你的脑子,大部分会觉得有点压力.
Django 的安装(环境linux)
1.首先查看自己是否安装过
-
查看已安装的版本
>>> import django >>> print(django.VERSION) (2, 2, 12, 'final', 0)
-
安装
- 在线安装
- $ sudo pip3 install django` 安装django的最新版本
- 或
$ sudo pip3 install django[==版本]
安装django的指定版本- 如:
- `$ sudo pip3 install django==2.2.12
- 离线安装
- 下载安装包:
- 安装离线包
$ tar -xvf Django-2.2.12.tar.gz
$ cd Django-2.2.12
$ sudo python3 setup.py install
- 在线安装
-
Django的卸载
-
$ pip3 uninstall django
-
Django 的开发环境
- Django 2.2.12 支持python 3.5,3.6,3.7,3.8
上述是Django的准备阶段,接下来开始创建项目一个示例项目进行讲解.在实战中学习,总结规律.
3.博客项目系统
(包含所有的模块讲解)首先创建一个文件存放我们项目,my_blog
1.创建项目和创建app指令
$ django-admin starttproject myblog
#查看项目是否创建成功
$ ls
# 进入项目主目录
$ cd myblog
$ ls //再次查看项目目录 出现文件manage.py 此时一切ok
//此时可以启动,如果之前学习过数据库,也可以配置数据库在起启动
$ python3 manage.py runserver
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcL5RUE0-1601782025431)(/home/tarena/.config/Typora/typora-user-images/image-20201004091534451.png)]
出现类似现象,为启动成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfeH5EgD-1601782025433)(/home/tarena/.config/Typora/typora-user-images/image-20201004093428793.png)]
赶紧打开浏览器,输入http://127.0.0.1:8000 就可以看见django提供的启动的页面,一个正在起飞的小火箭。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RCSwfepV-1601782025434)(/home/tarena/.config/Typora/typora-user-images/image-20201004094529993.png)]
看到此页面就表示 项目启动成功恭喜你,已经进入学习django的大门。
Django项目的目录结构
-
示例:
$ django-admin startproject mysite1 $ tree myblog/ myblog/ #项目的根目录,在配置文件中就在是BAES_DIR ├── manage.py #项目的主管理程序文件 └── myblog #与项目同名的文件 ├── __init__.py#包初始化文件 ├── settings.py#项目的配置文件 ├── urls.py #项目的主路由(总调度) └── wsgi.py #与配置相关,day08会讲. 1 directory, 5 # 此时的目录不包含新创建的user app
-
项目目录结构解析:
-
manage.py
-
此文件是项目管理的主程序,在开发阶段用于管理整个项目的开发运行的调式
-
manage.py
包含项目管理的子命令, 如:-
python3 manage.py runserver
启动服务 -
python3 manage.py startapp
创建应用 -
python3 manage.py makemigrations
创建数据库迁移脚本. -
python3 manage.py migrate
数据库迁移 -
...
如果忘记子命令,输入Python3 mange.py直接回车,把所有的命令打印出来.
-
-
-
mysite1 项目文件夹
- 项目包的主文件夹(默认与项目名称一致)
__init__.py
- 包初始化文件,当此项目包被导入(import)时此文件会自动运行
wsgi.py
- WSGI 即 Web Server Gateway Interface
- WEB服务网关接口的配置文件,仅部署项目时使用
urls.py
- 项目的主路由配置文件,所有的动态路径必须先走该文件进行匹配 相当于总调度
settings.py
- Django项目的配置文件, 此配置文件中的一些全局变量将为Django框架的运行传递一些参数
- setting.py 配置文件,启动服务时自动调用,
- 此配置文件中也可以定义一些自定义的变量用于作用全局作用域的数据传递
-
URL介绍
url: 统一资源定位符号(uniform resource locator)
Django的路由配置,在urls.py中配置理由
1.path()函数
-
用于描述路由与视图函数的对应关系
-
模块
from django.urls import path
-
语法:
- path(route, views, name=None)
- 参数:
- route: 字符串类型,匹配的请求路径一般写相对路由.
- views: 指定路径所对应的视图处理函数的名称
- name: 为地址起别名,在模板中地址反向解析时使用
path转换器
语法: <转换器类型:自定义名>
作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
转换器 效果 案例 str 匹配除了 '/'
之外的非空字符串"v1/users/<str:username>"匹配 /v1/users/guoxiaonao int 匹配0或任何正整数。返回一个 int “page/<int:page>” 匹配 /page/100 slug 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签 “detail/<slug:sl>” 匹配 /detail/this-is-django path 匹配非空字段,包括路径分隔符 '/'
"v1/users/<path:ph>"匹配 /v1/goods/a/b/c
2.re_path()函数
-
在url 的匹配过程中可以使用正则表达式进行精确匹配
- 导入
from django.urls import re_path
- 导入
-
语法:
- re_path(reg, view, name=xxx)
- 正则表达式为命名 分组模式
(?P<name>pattern)
;匹配提取参数后用关键字传参方式传递给视图函数
3.分布式路由
- 在主路由配置
- 语法:path(‘定为 app/’,include( “app.urls”) )
#主路由下配置
from django.contrib import admin
from django.urls import path, include, re_path
from user import views
urlpatterns = [
path('admin/', admin.site.urls),
# 普通路由
path('user', views.user),
# 正则表达式路由
re_path('user/<str:name>', views.user),
# 分布式路由
path('user/', include('user.urls')),
]
4.HTTP协议的请求和响应
1.HTTP1.1 请求详述
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。获取页面 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。创建资源 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。更新资源 |
5 | DELETE | 请求服务器删除指定的页面。删除资源 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。翻墙代理 |
7 | OPTIONS | 允许客户端查看服务器的性能。协商请求 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。理由测试 |
- HttpRequest对象
- 视图函数的第一个参数是HttpRequest对象
- 服务器接收到http协议的请求后,会根据请求数据报文创建HttpRequest对象
- request属性
- path_info: URL字符串
- method:字符串,表示HTTP请求方法,常用值:‘GET’、‘POST’
- GET:QueryDict查询字典的对象,包含查询字符串的所有数据
- POST:QueryDict查询字典的对象,包含post表单提交方式的所有数据
- FILES:类似于字典的对象,包含所有的上传文件信息
- COOKIES:Python字典,包含所有的cookie,键和值都为字符串
- session:似于字典的对象,表示当前的会话
- body: 字符串,请求体的内容(POST或PUT)
- scheme : 请求协议(‘http’/‘https’)
- request.get_full_path() : 请求的完整路径 包含查询字符串
- request.get_host() : 请求的主机
- request.META : 请求中的元数据(消息头)
- request.META[‘REMOTE_ADDR’] : 客户端IP地址
1.HTTP 响应 HttpResponse()类;
-
HTTP状态码的英文为HTTP Status Code。
比较常用的相应类:
HttpResponse() 返回请求数据
HttpResponseRediret() 重定向,返回其他路由。
-
下面是常见的HTTP状态码:
-
200 - 请求成功
-
301 - 永久重定向-资源(网页等)被永久转移到其它URL
入一个旧的URL时,服务器会返回一个响应,在响应头Location中:储存新的要跳转的URL.然后浏览器使用新的url发出的http请求.
-
302 - 临时重定向
-
在业务上,例如电商的促销会使用临时重定向.从Django实现上来讲:使用httpResponseRedirect(url)类.需要在前端重定向:js代码:windows.location=新的url.
-
404 - 请求的资源(网页等)不存在
-
500 - 内部服务器错误
-
-
Django中的响应对象HttpResponse:
-
构造函数格式:
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
-
作用:
- 向客户端浏览器返回响应,同时携带响应体内容
-
参数:
-
content:表示返回的内容。
-
status_code:返回的HTTP响应状态码(默认为200)。
-
content_type:指定返回数据的的MIME类型(默认为"text/html")。浏览器会根据这个属性,来显示数据。如果是text/html,那么就会解析这个字符串,如果text/plain,那么就会显示一个纯文本。
- 常用的Content-Type如下:
'text/html'
(默认的,html文件)'text/plain'
(纯文本)'text/css'
(css文件)'text/javascript'
(js文件)'multipart/form-data'
(文件提交)'application/json'
(json传输)
'application/xml'
(xml文件)
注: 关键字MIME(Multipurpose Internet Mail Extensions)是指多用途互联网邮件扩展类型。
- 常用的Content-Type如下:
-
-
5.Django处理GET和POST请求
-
无论是GET还是POST,统一都由视图函数接收请求,通过判断request.method 区分具体的请求动作
-
样例:
if request.method == 'GET': 处理GET请求时的业务逻辑 elif request.method == 'POST': 处理POST请求的业务逻辑 else: 其他请求业务逻辑 #python代码中,注意请求方法的比对,需要大写.
1.GET处理
-
GET请求动作,一般用于向服务器获取数据
-
能够产生GET请求的场景:
-
浏览器地址栏中输入URL,回车后
-
<a href="地址?参数=值&参数=值">
-
form表单中的method为get
<form method='get' action="/user/login"> 姓名:<input type="text" name="uname"> </form>
-
-
GET请求方式中,如果有数据需要传递给服务器,通常会用查询字符串(Query String)传递 【注意:不要传递敏感数据】
-
URL 格式:
xxx?参数名1=值1&参数名2=值2...
- 如:
http://127.0.0.1:8000/page1?a=100&b=200
- 如:
-
服务器端接收参数
获取客户端请求GET请求提交的数据
request.GET['参数名'] # QueryDict request.GET.get('参数名','默认值') request.GET.getlist('参数名') # mypage?a=100&b=200&c=300&b=400 # request.GET=QueryDict({'a':['100'], 'b':['200','400'], 'c':['300']}) # a = request.GET['a'] # b = request.GET['b'] # Error
-
2.POST处理
-
POST请求动作,一般用于向服务器提交大量数据
-
客户端通过表单等POST请求将数据传递给服务器端,如:
<form method='post' action="/login"> 姓名:<input type="text" name="username"> <input type='submit' value='登陆'> </form>
-
form 表单的name属性
-
在form表单控件提交数据时,会自动搜索本表单控件内部的子标签的name属性及相应的值,再将这些名字和值以键-值对的形式提交给action指定的服务器相关位置
-
在form内能自动搜集到的name属性的标签的控件有
<input name='xxx'> <select name='yyy'></select> <textarea name='zzz'></textarea>
-
-
-
服务器端接收参数
- 通过 request.method 来判断是否为POST请求,如:
if request.method == 'POST': 处理POST请求的数据并响应 else: 处理非POST 请求的响应
-
使用post方式接收客户端数据
request.POST['参数名'] # request.POST 绑定QueryDict request.POST.get('参数名','') request.POST.getlist('参数名')
-
取消csrf验证,否则Django将会拒绝客户端发来的POST请求
-
取消 csrf 验证
- 注释掉 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中间件,否则后禁止提交表单数据。
MIDDLEWARE = [ ... # 'django.middleware.csrf.CsrfViewMiddleware', ... ]
-