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'404']


# 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'404']


# 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'404']


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、总结

猜你喜欢

转载自www.cnblogs.com/venicid/p/9231549.html