web框架之Django基础

本节内容

  • HTTP协议
  • wsgi协议和wsgiref模块
  • Djano基本流程和配置
  • Django的路由系统
  • Django静态文件
  • template模板语言

一 HTTP协议

 1 HTTP简介

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。
其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
HTTP协议具有如下特点:
(1) 基于TCP的80端口
(2) 基于请求-响应模式
(3) 无状态保存,不对请求和响应之间的通信状态进行保存
(4) 无连接,限制每次连接至处理一个请求,处理完成后即断开连接

2 HTTP中的方法

GET:从一个服务器获取一个资源
HEAD:只从服务器获取文档响应首部,而不获取响应内容
POST:向服务器发送要处理的数据
PUT:将请求的主体部分直接存储在服务器上
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法

 3 HTTP的报文格式

请求:request
响应:response
request报文
<method> <request-URL> <version>
<headers>

<entity-body>

resposene报文
<version> <status><reason-phrase>
<headers>

<entity-boday>

 4 HTTP中的响应状态码

三位数字,如200,301,203,404,502,描述标记请求发生的状况

状态代码:
1XX:纯信息
2XX:成功类的信息
3xx:重定向类信息
4xx:客户端错误类的信息
5xx:服务器端错误类信息

常用状态码:
200:成功,请求的所有数据通过响应报文entity-body部分发送
301:请求的URL资源已被删除,但在响应报文中通过Location指明了资源现在的位置,Moved Permanently
302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置
304:客户端发出了条件式请求,但服务器的资源未曾发生改变,则通过响应此响应状态码通知客户端:Not Modified
401:需要输入账号和密码认证方能访问资源:Unauthorized
403:请求被禁止;Forbidden
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应

5 HTTP请求头部和响应头部包含的内容

通用首部:
Date:报文的创建时间
Connetction:连接方式,如keep-alive,close
Via:显示报文经过的中间节点
Cache-Control:控制缓存

请求首部
Accpet:通知服务器自己可接受的媒体类型
Accept-Charset:通知服务器自己可接受的字符集
Accept-Encoding:通知服务器自己接受的编码格式,如GZIP
ACCPT-Language:接受的语言
Host:请求的服务器名称和端口号
Rerferer:包含当前正在请求资源的上一级资源
User-Agent:客户端代理
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修过
If-Unmodified-Since:自从指定的时间之后,请求的资源是否未过修过
If-None-Mathc:本地缓存中存储的文档的Etagb标签是否与服务器ETG不匹配
Authorization:向服务器端发送认证信息,如账号密码
Cookie:客户端向服务器端发送Cookie标识
Proxy-Authorization:向代理服务器认证

响应首部
Age:响应持续时长
Server:服务器程序的软件名称和版本
协商首部:某资源多种表示方法时使用
Accpet-Ranges:服务器可接受的请求范围类型
Vary:服务器查看其它首部列表
安全响应首部:
Set-Cookie:向客户端设置cookie
www.Authenticate:来自服务器对客户端的质询认证表单

6 Cookie和Session

Cookie和Session都为了用来保存状态信息,都是保存客户端状态机制,都是为了解决HTTP无状态的问题而产生
Session可以用Cookie来实现,也可以用URL回写的机制来实现。用Cookie来实现的Session可以认为是对Cookie更高级的应用。

Cookie和Session有以下明显的不同点:
   (1) Cookie将状态保存在客户端,Session将状态保存在服务端
   (2) Cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
   (3) Session是针对每一个用户的,变量值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给浏览器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。
   (4) 就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

关于session和Cookie在Django的具体使用请见:

7 通过sokcet 建立一个HTTP响应

def create_sk():
	server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	server.bind(('127.0.0.1', 8080))
	server.listen(5)
	return server
		
def handle_request(server):
	print('server start....')
	while 1:
		conn,addr = server.accept()
		data = conn.recv(1024)
		print(data)             # 接收到 http请求头部
		conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
		conn.send(b'<h1>hello world</h1>')

def run():
	sk = create_sk()
	handle_request(sk)

if __name__ == '__main__':
	run()

  

 二 wsgi协议和wsgiref模块

WSGI:Web Server Gateway Interface,是Python应用程序或框架和Web服务器之间的一种接口,而wsgiref模块就是python基于wsgi协议开发的服务模块。
自己定义一个web框架所需的几个主要文件
    1 urls.py:路径与视图函数映射关系 --- url控制器
    2 views.py: 视图函数,固定一个形式参数:environ
    3 templates文件夹: html模板文件
    4 models:在项目启动前创建表结构

通过wsgire模块自己搭建一个web服务器

main.py  主程序	:

from wsgiref.simple_server import make_server
import urls

def application(environ,start_response):
	path = environ["PATH_INFO"]  # 获取当前请求路径
	print('server start')
	start_response('200 OK', [('Content-Type', 'text/html')])
	urls_list = urls.routers()
	func = None
	for i in urls_list:
	if path == i[0]:
		func = i[1]
	if func:
		return func()
	else:
		return [b'<h1>404 not found</h1>']
			
urls.py 控制器
from view import *
def routers():
	urls_list = [
			   ('/login', login),
			]
	return urls_list
		
view.py 视图函数
	def login():
		with open('templates/login.html', 'rb') as f:
				data = f.read()
		return [data]

http_server = make_server('', 8080 ,application)
http_server.serve_forever()

  

猜你喜欢

转载自www.cnblogs.com/harryblog/p/9342737.html