django (一)http协议
(一)Http协议
超文本传输协议(英文:Hyper Text Transfer Protocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。
HTTP 规定请求和响应的标准
http://www.cnblogs.com/maple-shaw/articles/9060408.html
1.浏览器输入url经历的步骤
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本并显示内容;
2.8种请求方法
GET **
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST **
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
注意事项:
- 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
- HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源。
3.状态码
状态代码的第一个数字代表当前响应的类型:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
4.url
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
- 传送协议。
- 层级URL标记符号(为[//],固定不变)
- 访问资源需要的凭证信息(可省略)
- 服务器。(通常为域名,有时为IP地址)
- 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
- 路径。(以“/”字符区别路径中的每一个目录名称)
- 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- 片段。以“#”字符为起点
协议
域名 IP
端口 http 80 https 443
URL路径
查询参数
?k1=v1&k2=v2
5.请求头和请求体
请求(浏览器发给服务器的数据 request)
格式:
"请求方法 路径 协议版本\r\n
k1 : v1\r\n
k2 : v2\r\n
\r\n
请求数据" get 请求没有请求体
响应(服务器返回给浏览器的数据 response)
格式:
"协议版本 状态码 状态描述\r\n
k1 : v1\r\n
k2 :v2\r'n
\r\n
响应数据(响应体)" html文本
请求格式:
l 请求方法URI协议/版本
GET/sample.jspHTTP/1.1
l 请求头(Request Header)
k1:v1
l 请求正文
username=jinqiao&password=1234
响应格式:
l 协议/版本 状态码 描述
HTTP/1.1 200 OK
l 响应头(Response Header)
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
l 响应正文
Content-Length:112
6.浏览器发送请求接收响应的流程
- 在浏览器的地址栏中输入地址,回车。发送一个GET请求。
- 按照HTTP协议的格式发送数据
- 服务器接收到数据,拿到url路径,根据url的路径执行对应的函数,得到返回的内容
- 服务器把响应的内容按照http的响应格式发送给浏览器
- 浏览器接收到数据,断开连接。解析数据。
(二)web框架的功能:
- 使用socket收发消息
- 根据不同路径返回不同的内容
- 返回动态的数据 (字符串的替换 模板的渲染)
本质: socket服务端
功能:- socket收发消息 wsgi wsgiref uwsgi
- 根据不同的路径返回不同的内容
- 返回动态页面(字符串的替换 模板的渲染 jinja2)
分类
django 2 3
flask 2
tornado 1 2 3
简易版web框架
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
def home():
ret = '欢迎回家! - {}'
return ret.encode('utf-8')
list1 = [
('/home', home),
]
while True:
conn,addr = sk.accept()
data = conn.recv(1024).decode('utf-8')
print(data)
ret1 = data.split()[1]
print(ret1)
for i in list1:
if ret1 == i[0]:
a = i[1]()
break
else:
a = '被查办了!'.encode('utf-8')
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(a)
conn.close()
(三)django
下载安装:
- 命令行
pip3 install django==1.11.23 -i https://pypi.tuna.tsinghua.edu.cn/simple
(清华源) - pycharm
创建项目:
- 命令行
django-admin startproject 项目名称
2. pycharm
flie _ new_project _ django _ 项目路径 选解释器
启动项目:
- 命令行
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
2. pycharm
点绿三角 dj 不要右键运行文件
简单使用:
urls.py 写url 和函数的对应关系 写函数
from django.shortcuts import HttpResponse, render
def index(request):
return HttpResponse('欢迎进入红浪漫!') # 返回字符串
def home(request):
return render(request, 'home.html') # 返回html页面
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', index), # 路径和函数的对应关系
url(r'^home/', home),
]
1.静态文件的配置
STATIC_URL = '/static/' # 别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATICFILES_DIRS = [ #按照列表的顺序进行查找
os.path.join(BASE_DIR, 'x1'),
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'x2')
]
2.登陆的实例
form表单
- action 提交的地址 method post
- input 需要有name
- submit 提交的按钮或者input
目前提交post请求,注释一个csrf 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
前端模板 http://www.jq22.com
3.app
新建APP
python manage.py startapp app名称
注册APP
在settings中
INSTALLED_APPS = [
'app01',
'app01.apps.App01Config', # 推荐写法
]
目录
admin.py django admin
apps.py app的信息
models.py 模型 model 跟数据库有关
views.py 写函数
4.orm
使用mysql数据库的流程
-
创建一个mysql数据库;
-
在settings中配置数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'day53', # 数据库名称
'HOST': '127.0.0.1', # IP
'PORT': 3306, # 端口号
'USER': 'root', # 用户名
'PASSWORD': '123' # 密码
}
} -
使用pymysql模块连接mysql数据库。
写在与settings同级目录下的init.py中
import pymysql
pymysql.install_as_MySQLdb() -
写对应关系,在app下的models.py中写类。
class User(models.Model):
username = models.CharField(max_length=32) # username varchar(32)
password = models.CharField(max_length=32) # password varchar(32) -
执行数据库迁移的命令
python manage.py makemigrations # 记录下models.py的变更记录
python manage.py migrate # 变更记录同步到数据库
orm 操作
ret = models.User.objects.get(username=user, ) # 找不到就报错 找到多个也报错
ret = models.User.objects.filter(username=user, ) # 对象列表