Django基础
Web
1.什么是Web
Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件
2.Web应用程序的优缺点
优点
- 只需要一个适用的浏览器;
- 耗费很少的用户硬盘空间
- 它们不需要更新,因为所有新的特性都在服务器上执行,从而自动传达到用户端;
- 网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
- 因为它们在网络浏览器窗口中运行,所以大多数情况下它们是通过跨平台使用的 (例如Windows,Mac,Linux等等)
缺点
- 网络应用程序强调浏览器的适用性。
- 必须连网
- 它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。
- 隐私安全问题。
- 只能使用最新版本
总结一下,本质上:浏览器是一个socket客户端,服务器是一个socket服务端
HTTP协议
http协议简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。
http协议特性
- 基于TCP/IP协议之上的应用层协议
- 基于请求-响应模式
- 无状态保存
- 无连接
http请求协议与响应协议
http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的响应协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字 文本。
响应状态码
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求错误
请求与响应格式
#请求
#请求首行
GET /?name=lqz&age=18 HTTP/1.1\r\n (请求方式 URL?参数 协议版本\r\n)
# 请求头
Host: 127.0.0.1:8008\r\n
Cookie: csrftoken=7xx6BxQDJ6KB0PM7qS8uTA892ACtooNbnnF4LDwlYk1Y7S7nTS81FBqwruizHsxF\r\n\r\n
# 请求体
# 响应
HTTP/1.1 200 OK\r\n (协议版本 状态码 状态码的原因短语)
# 响应首部字段
……\r\n
……\r\n\r\n
# 响应主体
<html>
……
URL简介
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
格式:
协议://IP:端口(80)/路径?name=lqz&age=18
手写简单Web框架
目录结构
|-templates (存放html文件)
|-index.html
|-time.html
|-user.html
|favicon.ico (ico图标)
|my_urls.py (路由)
|views.py (视图函数)
|wsgireWeb.py(主程序)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>index</title> 6 </head> 7 <body> 8 <h1>Index</h1> 9 <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535371803060&di=e6b1aa91dbca2835eece18367cc3e2ae&imgtype=0&src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2Fb%2F5844ccac86fd6.jpg"> 10 </body> 11 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Time</title> 6 </head> 7 <body> 8 <h1>time</h1> 9 现在是北京时间:@@time@@ 10 </body> 11 </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>user_list</title> <style> table{ border: 1px solid #cccccc; border-collapse: collapse; } table th{ border: 1px #cccccc solid; } table td{ border: 1px #cccccc solid; } </style> </head> <body> <h1>user_list</h1> <table> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.AGE }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
import views urls = [ ('/index', views.index), ('/',views.home), ('/time', views.time), ('/user_list', views.user_list), ('/favicon.ico',views.favicon) ]
1 def time(environ): 2 import datetime 3 get_time = datetime.datetime.now().strftime('%Y-%m-%d %X') 4 with open('templates/time.html', 'r', encoding='utf-8') as f: 5 data = f.read() 6 data = data.replace('@@time@@', get_time) 7 return data.encode('utf-8') 8 9 10 def user_list(environ): # 连接数据库拿数据 11 import pymysql 12 from jinja2 import Template 13 # 拿到一个数据库连接 14 conn = pymysql.connect(host = '127.0.0.1',port = 3306, database = 'db3',user='root',password = '1111') 15 # 拿到一个游标对象 16 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 17 # 执行sql语句 18 cursor.execute('select * from t1') 19 # 拿到数据 20 user_list = cursor.fetchall() 21 print(user_list) 22 with open('templates/user_list.html','r',encoding='utf-8') as f: 23 data = f.read() 24 # 生成一个模板对象,需要传字符串 25 template = Template(data) 26 # 相当于在执行data.replace(),返回替换完成的字符串 27 data = template.render(user_list=user_list) 28 return data.encode('utf-8') 29 30 31 def error(environ): 32 return '404'.encode('gbk') 33 34 35 def index(environ): 36 with open('templates/index.html','rb') as f: 37 data = f.read() 38 return data 39 40 41 def home(environ): 42 return '主页'.encode('gbk') 43 44 45 def favicon(environ): 46 with open('favicon.ico','rb') as f: 47 data = f.read() 48 return data
1 from wsgiref.simple_server import make_server 2 from my_urls import urls 3 from views import error 4 5 6 def my_server(environ, start_response): 7 print(environ) 8 print(environ['PATH_INFO']) 9 start_response('200 OK', [('Content-Type', 'text/html')]) 10 func = None 11 for url in urls: 12 if url[0] == environ['PATH_INFO']: 13 func = url[1] 14 break 15 if func: 16 response = func(environ) 17 else: 18 response = error(environ) 19 return [response,] 20 21 22 23 # if environ['PATH_INFO'] in urls: 24 # response = urls[environ['PATH_INFO']](environ) 25 # else: 26 # response = error(environ) 27 # return [response, ] 28 29 30 if __name__ == '__main__': 31 my = make_server('127.0.0.1', 8002, my_server) 32 my.serve_forever()