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版本的发布,虚拟线程 ...
随机推荐
- Oracle EBS 请求
SELECT t.responsibility_id, t.responsibility_key, t.responsibility_name, t.description, t.menu_id, f ...
- 转:C# 线程同步技术 Monitor 和Lock
原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lo ...
- spring定时,cronExpression表达式解释
附:cronExpression表达式解释: 0 0 12 * * ?---------------在每天中午12:00触发 0 15 10 ? * *---------------每天上午10:15 ...
- Azure Cosmos DB 使用费用参考
之前在学习Cosmos DB 中SQL API(DocumentDB) 的时候,也就是之前做的一些笔记,看到有使用费用的一些介绍,就有兴趣的去了解了下,做了一下简单的总结. 想了解更多或是购买使用的还 ...
- 零基础图文傻瓜教程接入Facebook的sdk
零基础图文傻瓜教程接入Facebook的sdk 本人视频教程系类 iOS中CALayer的使用 0. 先解决你的 VPN FQ上外网问题,亲,解决这一步才能进行后续操作^_^. 1. 点击右侧链接 ...
- [翻译] M13BadgeView
M13BadgeView M13BadgeView is a customizable badge view for iOS applications. The badge is built to b ...
- elastic search报错——“failed to obtain node locks”
启动时报错信息: 这里写图片描述 寻找主要信息:failed to obtain node locks这里写图片描述简单理解为:绑定节点失败!!! 百度后,好多人同样遇到了这个问题,导致的原因可能是因 ...
- pandas模块安装问题笔记
1. # pip install pandas 引用 pandas 时,没有模块 ,进行模块安装,出现一推英文提示 结果 Collecting pandas Could not fetch URL ...
- PHP开发者应了解的24个库
@PHP开发者应了解的24个库 本文由 伯乐在线 - 贾朝藤 翻译.未经许可,禁止转载!英文出处:tutorialzine.欢迎加入翻译组. 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许 ...
- 4-1 R语言函数 lapply
#lapply函数 #可以循环处理列表中的每一个元素 #lapply(参数):lapply(列表,函数/函数名,其他参数) #总是返回一个列表 #sapply:简化结果 #结果列表元素长度均为1,返回 ...