Django -- 基础
12.1 HTTP
超文本传输协议(英文:Hyper Text Transfer Protocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信基础.HTTP有很多应用,最著名的是用于Web浏览器服务器之间的双工通信.
HTTP是一个客户端(用户)和服务器端(网站)请求和应答的标准(TCP).
12.1.1 HTTP请求/响应的步骤:
-
客户啊短连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接.
-
发送HTTP请求
通过TCP协议套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行,请求头部,空行和请求数据4部分组成.
-
服务器接收请求并返回HTTP响应
Web服务器解析请求,定位请求资源.服务器将资源副本写到TCP套接字,由客户端读取.一个响应由状态行,响应头部,空行和响应数据4部分组成
-
释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
-
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
在浏览器地址栏键入URL,按下回车之后经历的流程:(面试题)
-
浏览器向DNS服务器请求解析该URL中的域名所对应的的IP地址;
-
解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接
-
浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器.
-
服务器对浏览器请求作出相应,并把对应的HTML文本发送给浏览器
-
释放TCP连接
-
浏览器将该HTML文本并显示内容
12.1.2 HTTP请求方法
-
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
-
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
-
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
-
PUT
向指定资源位置上传其最新内容。
-
DELETE
请求服务器删除Request-URI所标识的资源。
-
TRACE
回显服务器收到的请求,主要用于测试或诊断。
-
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作
-
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
12.1.3 HTTP状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
-
1xx消息——请求已被服务器接收,继续处理
-
2xx成功——请求已成功被服务器接收、理解、并接受 ***
-
3xx重定向——需要后续操作才能完成这一请求
-
4xx请求错误——请求含有词法错误或者无法被执行
404: NOT FIND(服务器上没有) 403 服务器上有,但是没有权限 ***
-
5xx服务器错误——服务器在处理某个正确请求时发生错误
12.1.4 URL
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
-
传送协议。
-
层级URL标记符号(为[//],固定不变)
-
访问资源需要的凭证信息(可省略)
-
服务器 -- (通常为域名,有时为IP地址)
-
端口号 -- (以数字方式表示,若为HTTP的默认值":80",https 端口默认":443"可省略)
-
路径 -- (以“/”字符区别路径中的每一个目录名称)
-
查询 -- (GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
-
片段 -- 以“#”字符为起点
https://www.sogou.com:443/web?query=海水两边颜色不同&_asf=www.sogou.com&_ast=&w=01015002&p=40040108&ie=utf8&from=index-nologin&s_from=index&oq=&ri=0&sourceid=sugg&suguuid=&sut=0&sst0=1566374533005&lkt=0%2C0%2C0&sugsuv=0003ECF37B7010FB5D174856999B7817&sugtime=1566374533005
-
http,是协议;
-
www.sogou.com
是域名,服务器 -
443是服务器上的网路端口号
-
/web 是路径
-
?query=海水两边颜色不同 : 问号之后是查询参数
请求 ( 浏览器发给服务器的数据,request )
响应 ( 服务器发给浏览器的数据,response )
12.1.5 web框架
web框架的本质 : socket服务端
1. web框架的功能
-
使用socket收发消息
-
根据不同的路径返回不同的内容
-
返回动态的数据(字符串的替换 -- 模板的渲染(使用jinja2) )
分类:
-
Django实现 2 3 功能
-
flask 实现 2 功能
-
tornado 实现 1 2 3功能
2. 服务器程序和应用程序
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uWSGI、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。
12.2 Django基础
12.2.1 Django的下载安装
-
命令行
pip3 install django==1.11.23 -i https://pypi.tuna.tsinghua.edu.cn/simple
-
pycharm
12.2.2 创建项目
-
命令行
django-admin startproject 项目名称
-
pycharm
flie _ new_project _ django _ 项目路径 选解释器
12.2.3 启动项目
-
命令行
-
python manage.py runserver # 127.0.0.1:8000
-
python manage.py runserver 80 # 127.0.0.1:80 修改端口号
-
python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 修改IP和端口号
-
-
pycharm
点绿三角 dj --> 不要右键运行文件
12.2.4 简单的使用
-
urls.py
写url
与函数的对应关系,写函数
from django.shortcuts import HttpResponse,render def func(request): return HttpResponse('返回的字符串') # 返回字符串 def home(request): return render(request,'home.html') # 返回html页面 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^func/', func), # 路径和函数的对应关系 url(r'^home/', home), ]
-
静态文件的配置
STATIC_URL = '/static/' # 别名 STATICFILES_DIRS = [ # 按照列表的顺序进行查找 os.path.join(BASE_DIR, 'x1'), os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'x2') ]
-
登录的实例
form表单
-
action -- 提交的地址 , method -- 请求方法 ( 默认是get , 设置post )
-
input 需要有name属性 , required表示必须填写(可以去掉)
-
submit 提交的按钮或者input
-
form表单 novalidate不需要校验
目前提交post请求,要注释一个csrf中间件 ( setting.py文件)
-
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # csrf中间件 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
-
GET和POST
# Django中获取数据: request.GET.get('k1',返回值) # 获取数据 request.POST.get('k1',返回值) # 提交数据
12.2.5app
-
新建app
python36 manage.py startapp app名字
-
注册app
在setting中
INSTALLED_APPS = [ # 两种方法 'app01', 'app01.apps.App01Config', # 推荐写法 ]
目录:
admin.py django提供一个 admin工具 apps.py app的信息 models.py 模型 model 跟数据库有关 views.py 写函数
12.2.6 使用mysql
数据库的流程
-
创建一个
mysql
数据库注意setting.py文件中的 TEMPLATES 的 DIR 路径
-
在settings中配置数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'day54', # 数据库名称 'HOST': '127.0.0.1', # IP 'PORT': 3306, # 端口号 'USER': 'root', # 用户名 'PASSWORD': '123' # 密码 } }
-
使用
pymysql
模块连接数据库# 写在与setting同级目录下的init.py中 import pymysql pymysql.install_as_MySQLdb()
-
写对应关系,在
app
下的models.py
中写类class User(models.Model): username = models.CharField(max_length=32) # varchar类型(长度32) password = models.CharField(max_length=32) # varchar类型(长度32)
-
执行数据库迁移的命令
python36 manage.py makemigrations # 记录下models.py的变更 python36 manage.py migrate # 将变更记录同步到数据库中
12.2.7ORM
ORM
概念
-
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
-
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
-
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM
优势
-
ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
-
ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。
-
让软件开发人员专注于业务逻辑的处理,提高了开发效率。
ORM
劣势
-
ORM的缺点是会在一定程度上牺牲程序的执行效率。
-
ORM的操作是有限的,也就是ORM定义好的操作是可以完成的,一些复杂的查询操作是完成不了。
-
ORM用多了SQL语句就不会写了,关系数据库相关技能退化...
在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表。
基本情况:
-
每个模型都是一个Python类,它是django.db.models.Model的子类。
-
模型的每个属性都代表一个数据库字段。
-
综上所述,Django为您提供了一个自动生成的数据库访问API
orm
操作
获取对象
ret = models.User.objects.get(username=username, password=password) # 找不到或者找到多个都会报错 ret = models.User.objects.filter(username=username, password=password) # queryset对象列表:查到几个列表中有几个,没有查到为空列表