02-web框架
1
while True:
print('server is waiting...')
conn, addr = server.accept()
data = conn.recv(1024)
print('data:', data)
# 1.得到请求的url路径
# ------------dict/obj d=["path":"/login"]
# d.get(”path“) # 按着http请求协议解析数据 # 专注于web业务开发
path = d.get('path') if path == "/login":
return login.html # 按着http响应协议封装数据
2
# 报错信息
C:\Windows\system32>pip install wsgiref
Collecting wsgiref
Using cached https://files.pythonhosted.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\Venicid\AppData\Local\Temp\pip-build-f8zmzqr9\wsgiref\setup.py", line 5, in <module>
import ez_setup
File "C:\Users\Venicid\AppData\Local\Temp\pip-build-f8zmzqr9\wsgiref\ez_setup\__init__.py", line 170
print "Setuptools version",version,"or greater has been installed."
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Setuptools version",version,"or greater has been installed.")? ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\Venicid\AppData\Local\Temp\pip-build-f8zmzqr9\wsgiref\
# wsgiref 是标准库,不需要安装 C:\Windows\system32>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC
>>> import wsgiref
from wsgiref.simple_server import make_server def application(environ,start_response):
# 按着http协议解析数据:environ
# 按着http协议组装数据:start_response
print(environ)
print(type(environ)) start_response('200 OK', []) return [b"<h3>hello wsgiref</h3>"] # 1.封装socket
httpd = make_server("",8802,application) # 2.等待用户连接: conn,addr = server.accept()
httpd.serve_forever() # application(environ,start_response)
根据path进行响应不同的html
方案1:
from wsgiref.simple_server import make_server def application(environ,start_response):
# 按着http协议解析数据:environ
# 按着http协议组装数据:start_response
print(environ)
print(type(environ)) # 当前的请求路径
path = environ.get('PATH_INFO')
print(path)
start_response('200 OK', [])
if path == "/login":
with open('login.html','r') as f:
data = f.read()
elif path == '/index':
with open('index.html','r') as f:
data = f.read()
elif path == '/favicon.ico': # icon图标
with open('favicon.ico','rb') as f:
data = f.read()
return [data]
return [data.encode('utf8')] # 1.封装socket
httpd = make_server("",8802,application) # 2.等待用户连接: conn,addr = server.accept()
httpd.serve_forever() # application(environ,start_response)
方案2:解耦
from wsgiref.simple_server import make_server def login():
with open('login.html', 'rb') as f:
data = f.read()
return data def index():
with open('index.html', 'rb') as f:
data = f.read()
return data def favi():
with open('favicon.ico', 'rb') as f:
data = f.read()
return data def application(environ, start_response):
# 按着http协议解析数据:environ
# 按着http协议组装数据:start_response
print(environ)
print(type(environ)) # 当前的请求路径
path = environ.get('PATH_INFO')
start_response('200 OK', []) url_patterns = [
("/login",login),
('/index',index),
('/favicon.ico',favi)
] func = None
for item in url_patterns:
if path == item[0]:
func = item[1]
break
if func:
return [func()]
else:
return [b''] # 1.封装socket
httpd = make_server("", 8805, application) # 2.等待用户连接: conn,addr = server.accept()
httpd.serve_forever() # application(environ,start_response)
添加新的reg模块:快速方便
添加请求environ
from wsgiref.simple_server import make_server def login(environ):
with open('login.html', 'rb') as f:
data = f.read()
return data def index(environ):
with open('index.html', 'rb') as f:
data = f.read()
return data def reg(environ):
with open('reg.html', 'rb') as f:
data = f.read()
return data def favi(environ):
with open('favicon.ico', 'rb') as f:
data = f.read()
return data def application(environ, start_response):
# 按着http协议解析数据:environ
# 按着http协议组装数据:start_response
print(environ)
print(type(environ)) # 当前的请求路径
path = environ.get('PATH_INFO')
start_response('200 OK', []) url_patterns = [
("/login",login),
('/index',index),
('/favicon.ico',favi),
('/reg',reg)
] func = None
for item in url_patterns:
if path == item[0]:
func = item[1]
break
if func:
return [func(environ)]
else:
return [b''] # 1.封装socket
httpd = make_server("", 8805, application) # 2.等待用户连接: conn,addr = server.accept()
httpd.serve_forever() # application(environ,start_response)
3、yun框架
main.py 启动程序
from wsgiref.simple_server import make_server def application(environ, start_response):
path = environ.get('PATH_INFO')
start_response('200 OK', []) from urls import url_patterns # 导入路由表 func = None
for item in url_patterns:
if path == item[0]:
func = item[1]
break
if func:
result = func(environ) # 执行视图函数
return [result] else:
return [b''] print('start yun框架...') # 1.封装socket
httpd = make_server("", 8806, application) # 2.等待用户连接: conn,addr = server.accept()
httpd.serve_forever() # application(environ,start_response)
urls.py路由分发
from views import * url_patterns = [
("/login", login), # 视图函数
('/index', index),
('/favicon.ico', fav),
('/reg', reg),
('/timer', timer)
]
views.py 视图函数
def login(environ):
with open('./templates/login.html', 'rb') as f:
data = f.read()
return data def index(environ):
with open('./templates/index.html', 'rb') as f:
data = f.read()
return data def reg(environ):
with open('./templates/reg.html', 'rb') as f:
data = f.read()
return data def fav(environ):
with open('./templates/favicon.ico', 'rb') as f:
data = f.read()
return data def timer(environ):
import datetime
now_time = datetime.datetime.now().strftime('%y-%m-%d %X')
return now_time.encode('utf8') # bytes类型
4、
新建 models.py 数据交换py文件
# 数据库交互文件 # 生成用户表
import pymysql # 连接数据库
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
db='db61',
charset='utf8'
) # 获取游标
cursor = conn.cursor() # 执行sql语句
sql = """
create table userinfo(
id int primary key,
name varchar(32),
password varchar(32)
)
"""
cursor.execute(sql) # 提交
conn.commit() # 关闭
cursor.close()
conn.close()
插入一个username password
views.py中的auth函数
def auth(request):
from urllib.parse import parse_qs # 分割取参数
try:
request_body_size = int(request.get('CONTENT_LENGTH',0))
except (ValueError):
request_body_size = 0 request_body = request['wsgi.input'].read(request_body_size)
data = parse_qs(request_body) user = data.get(b'username')[0].decode('utf8')
pwd = data.get(b'password')[0].decode('utf8') # 连接数据库
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='root',
db='db61',
charset='utf8'
)
# 创建游标
cursor = conn.cursor() # 执行sql
sql = "select * from userinfo where name='%s' and password='%s'" % (user, pwd)
cursor.execute(sql) if cursor.fetchone(): # 执行成功,返回一条信息
result = index(request) # 登录成功,进入index页面
return result
else:
return 'Error username or passwrod'.encode('utf8')
5、总结
02-web框架的更多相关文章
- 02 初级版web框架
02 初级版web框架 服务器server端python程序(初级版): import socket server=socket.socket() server.bind(("127.0.0 ...
- node.js之十大Web框架
之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...
- 第六模块:WEB框架开发 第1章·Django框架开发1~50
01-Django基础介绍 02-Web应用程序1 03-Web应用程序2 04-http请求协议1 05-http请求协议2 06-http协议之响应协议 07-wsgire模块1 08-wsgir ...
- Smart Framework:轻量级 Java Web 框架
Smart Framework:轻量级 Java Web 框架 收藏 黄勇 工作闲暇之余,我开发了一款轻量级 Java Web 框架 —— Smart Framework. 开发该框架是为了: 加 ...
- Python-S9-Day115——Flask Web框架基础
01 今日内容概要 02 内容回顾 03 Flask框架:配置文件导入原理 04 Flask框架:配置文件使用 05 Flask框架:路由系统 06 Flask框架:请求和响应相关 07 示例:学生管 ...
- 使用Python开发轻量级的Web框架以及基于WSGI的服务器来实现一个网站页面
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目说明 二丶数据准备 三丶使用网络TCP开发一个基于WSGI协议的Web服务器 四丶使用python3开发一个轻量级的 ...
- web框架之初识Django
目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...
- python 异步Web框架sanic
我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似 ...
- 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00
在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris.彩虹女神的名号响彻寰宇.名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Ir ...
- 支持JDK19虚拟线程的web框架,之一:体验
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于虚拟线程 随着JDK19 GA版本的发布,虚拟线程 ...
随机推荐
- SQLSERVER的 筛选索引(Fiter Index)
fiter index(筛选索引)是SQL Server的一项功能,可使此数据库与众不同. 筛选索引的概念 SQL Server中常用的索引是一种物理结构,它包含来自所有行的一组选定列的值 在一张桌子 ...
- VUE入门准备------>ES6
声明变量的方式: var let const let 和 var的区别 var定义的变量是全局的会覆盖全局的定义 ; ;i<;i++){ console.log(i) } undefi ...
- 点击单个cell高度变化的动画效果
点击单个cell高度变化的动画效果 效果 说明 1. 点击单个cell的时候,其展开与缩放动画实现起来是很麻烦的,做过相关需求的朋友一定知道其中的坑 2. 本例子只是提供了一个解决方案,为了简化操作, ...
- KHFlatButton
KHFlatButton https://github.com/kylehorn/KHFlatButton 效果: 对于自己做demo来说,每次设置button就不用这么折腾了,几句话就行了,非常爽: ...
- 服务器安装LNMP及构建个人站点
服务器安装LNMP(centos6.6+nginx1.7.12+mysql5.6.24+php5.6.7) 本次安装 centos6.6+nginx1.7.12+mysql5.6.24+php5.6 ...
- Mongo.exe 无法定位程序输入点terminate于动态链接库 *.dll的解决办法
Win7 或者Winserver 上安装新版的Mongo后,总是提示如上问题,可使用如下方法解决: 一是系统更新到SP1,并安装了KB2999226这个更新包(重要): 二是安装安装 Visual C ...
- Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
- js实现svg图形转存为图片下载[转]
我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...
- 学习python第三天单行函数
1.去重:distinct关键字 需求:查看公司一共有多少部门? select department_id from employees;此代码会查出107条记录,存在部门重复的问题! select ...
- [USACO08JAN]Running
嘟嘟嘟 这很显然是一道dp题. 令dp[i][j]表示第 i 分钟末,疲劳度为 j 是的最大跑步距离,则 dp[i][0] = max(dp[i - 1][0], max(dp[i - j][j])) ...