一:web应用
本质上:浏览器是一个socket客户端,服务器是socket服务端
基于socket的简单web应用
import socket soc=socket.socket() soc.bind(('127.0.0.1',8001)) soc.listen(5) while True: print('监听8001端口') conn,addr=soc.accept() data=conn.recv(1024) # 转换成str类型 data=str(data,encoding='utf-8') print(data) resquest_list=data.split(' ') first_list=resquest_list[0].split(' ') conn.send(b'HTTP/1.1 200 OK Content-Type:text/html ') if first_list[1]=='/index': # conn.send('<h1>index</h1><img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=775f519ac08065386fe7ac41f6b4ca21/fd039245d688d43f63d84526771ed21b0ff43bf5.jpg">'.encode('utf-8')) with open('index.html','rb')as f: data=f.read() conn.send(data) elif first_list[1]=='/two': with open('two.html','r',encoding='utf-8')as f: data=f.read() import datetime now=datetime.datetime.now().strftime('%Y-%m-%d %X') data=data.replace('@@time@@',now) conn.send(data.encode('utf-8')) else: conn.send(b'404') # print(data) # # conn.send(b'HTTP/1.1 200 OK hello web') conn.close() ''' # 请求首行:请求类型 请求地址 请求协议 GET /index HTTP/1.1 # 请求头 Host: 127.0.0.1:8001 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 ' # 请求体 。。。。 '''
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=775f519ac08065386fe7ac41f6b4ca21/fd039245d688d43f63d84526771ed21b0ff43bf5.jpg">' </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> @@time@@ </body> </html>
分层的简单web框架
from wsgiref.simple_server import make_server import my_urls from views import * def my_server(environ, start_response): #environ:请求头对象 start_response:发送响应头 # print(environ) print(environ['PATH_INFO']) start_response('200 OK', [('Content-Type', 'text/html')]) func=None for url in my_urls.urls: if url[0]==environ['PATH_INFO']: func=url[1] break if func: response=func(environ) #函数返回值 else: response= error(environ) return [response,] if __name__ == '__main__': my=make_server('127.0.0.1',8002,my_server) my.serve_forever()
import views urls=[ ('/index',views.index), ('/time',views.time), ('/user_list',views.user_list), ('/favicon.ico',views.favicon), ]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=775f519ac08065386fe7ac41f6b4ca21/fd039245d688d43f63d84526771ed21b0ff43bf5.jpg">' </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> @@time@@ </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户列表</title> </head> <body> <table border="1"> <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.password}}</td> </tr> {%endfor%} </tbody> </table> </body> </html>
二:http协议
http协议特性:
1 基于TCP/IP协议之上的应用层协议
2 基于请求-响应模式
3 无状态保存 自身不对请求和响应之间的通信状态进行保存 (cookie)
4 无连接
--------------------------------------
http请求协议与响应协议
--------------------------------------
URL简介
?之前的是请求路径,?之后的是请求数据部分
--------------------------------------
请求首行:请求方式,请求地址,协议版本
请求头:key:value
请求体:post数据提交的部分
三:django安装、创建、启动
ps:长期支持版和非长期支持版 长期支持版:1.11和2.22
安装模块:
方式1 cmd 方式
pip3 install django==1.11
方式2 pycharm
pycharm settings
方式3 pycharm
pycharm terminal
--------------------------------------
ps:pycharm 默认使用国外的pip源
注意pip源管理,使用国内源
方式一
pip3 install django==1.11 -i https://pypi.tuna.tsinghua.edu.cn/simple/
方式二:
pycharm settings project
--------------------------------------
ps:安装的django在pip3 解释器下
--------------------------------------
创建django项目 ps:哪个路径下创建
django-admin.py startproject mysite
--------------------------------------
启动django ps:在创建的项目下执行
方式1 cmd下到项目目录下执行
python manage.py runserver ip:port
方式2 pycharm terminal下
python manage.py runserver ip:port
方式3 pycharm 右上角启动
--------------------------------------
虚拟环境
cp 系统环境
隔离 互不影响 装的东西只有自己的工程下可以使用
四:主流web框架总结
a socket
b 路由关系
c 模板字符串替换(模板语言)
主流web框架总结:
django
a用别人的 b自己写的 c自己写的
flask
a用别人的 b自己写的 c用别人的(jinja2)
tornado
a自己写的 b自己写的 c自己写的