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框架的更多相关文章

  1. 02 初级版web框架

    02 初级版web框架 服务器server端python程序(初级版): import socket server=socket.socket() server.bind(("127.0.0 ...

  2. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  3. 第六模块: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 ...

  4. Smart Framework:轻量级 Java Web 框架

    Smart Framework:轻量级 Java Web 框架 收藏 黄勇   工作闲暇之余,我开发了一款轻量级 Java Web 框架 —— Smart Framework. 开发该框架是为了: 加 ...

  5. Python-S9-Day115——Flask Web框架基础

    01 今日内容概要 02 内容回顾 03 Flask框架:配置文件导入原理 04 Flask框架:配置文件使用 05 Flask框架:路由系统 06 Flask框架:请求和响应相关 07 示例:学生管 ...

  6. 使用Python开发轻量级的Web框架以及基于WSGI的服务器来实现一个网站页面

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目说明 二丶数据准备 三丶使用网络TCP开发一个基于WSGI协议的Web服务器 四丶使用python3开发一个轻量级的 ...

  7. web框架之初识Django

    目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...

  8. python 异步Web框架sanic

    我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似 ...

  9. 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00

    在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris.彩虹女神的名号响彻寰宇.名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Ir ...

  10. 支持JDK19虚拟线程的web框架,之一:体验

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于虚拟线程 随着JDK19 GA版本的发布,虚拟线程 ...

随机推荐

  1. 生成器-yield初接触

    什么是生成器? 生成器的实质就是迭代器 在python中有三种方式来获取生成器 1. 通过生成器函数 2. 通过各种推导式实现生成器 3. 通过数据的转换也可以获取生成器 将函数中的return换成y ...

  2. SpringBoot部署流程

    一.  项目介绍 a)     本项目为SpringBoot项目 b)     使用内置Tomcat容器 一.  操作步骤 a)     配置pom.xml文件,确定打包方式 b)     更改项目返 ...

  3. Hadoop HBase概念学习系列之HBase里的Client(二十二)

    这个,很简单,但凡是略懂大数据的,就很清楚,不多说,直接上图.

  4. 字典 & 列表表达式 结合

    题: 思路: 要求的结果是小字典里面的两个值组成的列表,所以只要抓到小字典,这个题就可以用列表推导式直接表达了.所 以把小字典设为元素d,然后用d在列表里面遍历,列表呢,是大字典的一个值. 答案:  

  5. * args 和 **kwargs

    def func(*args, **kwargs): print(args,kwargs) func("对", "哦",o=4, k=0) 结果---> ...

  6. 【Alpha】Daily Scrum Meeting——blog2

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 忘记拍了!(没有拍照片的习惯,没有第四人拍照) 2. 每个人 ...

  7. PHP设计模式系列 - 委托模式

    委托模式 通过分配或委托其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性. 应用场景 设计了一个cd类,类中有mp3播放模式,和mp4播放模式 改进前,使用cd类的播放模式,需要在实例化的 ...

  8. [DAViCHi/SeeYa/T-ARA][원더우먼][Wonder Woman]

    歌词来源:http://music.163.com/#/song?id=5371229 作曲 : 赵英秀 [作曲 : 赵英秀] [作曲 : 赵英秀] 作词 : K-Smith [作词 : KSmith ...

  9. ARC与Toll-Free Bridging

    arc模块与mrc模块的沟通. 相当于程序的混编处理. Toll-Free Briding保证了在程序中,可以方便和谐的使用Core Foundation类型的对象和Objective-C类型的对象. ...

  10. 详解 MNIST 数据集

    转自:https://blog.csdn.net/simple_the_best/article/details/75267863 MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它 ...