web框架

1、wsgiref模块1

Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站

的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速

开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使

用的方法,大大提高了开发的效率。

wsgiref模块

让我们专注于web开发,其他的接受HTTP请求、解析HTTP请求、发送HTTP请求让wsgiref模块处理

----------------------------------------------------------------------------------------------------------------------------------------------------------

data=conn.recv(1024)
    print(data)
b
'GET / HTTP/1.1\r\nHost: 127.0.0.1:8880\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f\r\n\r\n' b'GET /yuan?name=yuan&age=22 HTTP/1.1\r\nHost: 127.0.0.1:8880\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f\r\n\r\n' b'POST / HTTP/1.1\r\nHost: 127.0.0.1:8880\r\nConnection: keep-alive\r\nContent-Length: 20\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nOrigin: http://127.0.0.1:8880\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nReferer: http://127.0.0.1:8880/\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\nCookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f\r\n\r\nuser=bisheng&pwd=456' ---------------------------------------------
URL: 协议://IP:端口(80)/路径?a=1&b=2 '''

 一个简单的wsgiref模块

from wsgiref.simple_server import make_server
# make_server 封装了以下内容
# sock_server=socket.socket()
# ip_port=('127.0.0.1',8080)
# sock_server.bind(ip_port)
# sock_server.listen(5)
def application(environ,start_response):
    # 按着http协议解析数据:environ
    # 按着http协议组装数据:start_response
    print(environ)
    print(type(environ)) # 字典
    start_response('200 OK')
    return [b'<h1>hello word</h1>']

#封装了socket
httped=make_server('127.0.0.1',8080,application)

# 等待用户连接:conn,addr=sock.accept()
httped.serve_forever()
View Code

-------------------

升华版本:

from wsgiref.simple_server import make_server
# make_server 封装了以下内容
# sock_server=socket.socket()
# ip_port=('127.0.0.1',8080)
# sock_server.bind(ip_port)
# sock_server.listen(5)
def application(environ,start_response):
    # 按着http协议解析数据:environ
    # 按着http协议组装数据:start_response
    print(environ)
    print(type(environ)) # 字典

    # 当前的请求路径
    path=environ.get('PATH_INFO')

    start_response('200 OK',[])


    if path=='/login':
        with open('login.html','r',encoding='utf-8')as f:
            data=f.read()

    elif path=='/index':
        with open('index.html','r',encoding='utf-8')as f:
            data=f.read()


    return [data.encode('utf-8')]


#封装了socket
httped=make_server('127.0.0.1',8080,application)

# 等待用户连接:conn,addr=sock.accept()
httped.serve_forever()
View Code

 

 

 start_response('200 OK',[])后面的空括号可以没有内容,但必须有

 DIY一个web框架

图标请求

浏览器主动请求服务器,获取图标

---------------------------------------------------------------------------------------------------------------------

from wsgiref.simple_server import make_server


def application(environ,start_response):
    start_response('200 OK',[])
    print(environ.get('PATH_INFO'))
    path = environ.get('PATH_INFO')

    # 方案一
    # if path=='/favicon.ico': # 图表请求
    #     with open('favicon.ico','rb')as f:
    #         data=f.read()
    #     return [data]
    # elif path=="/login":
    #      with open("login.html","rb") as f:
    #         data=f.read()
    #      return [data]
    #
    # elif path=="/index":
    #      with open("index.html","rb") as f:
    #         data=f.read()
    #      return [data]

    # 对上面的优化 ------ 路由分化


    url_patterns=[
        ('/login','login'),
        ('/index','index'),
        ('/favicon.ico','favicon')
    ]

    func = None
    for item in url_patterns:
        if path==item[0]:
            func=item[1]
            break
    if func:
        return [func1(func,environ)]
    else:
        return [b'404!']


# 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 favicon():
#     with open('favicon.ico','rb')as f:
#         data=f.read()
#     return data

# 继续优化代码
def func1(func,environ):
    if func=='favicon':
        with open(f'{func}.ico', 'rb')as f:
            data = f.read()
        return data

    with open(f'{func}.html', 'rb')as f:
        data = f.read()
    return data


httpd=make_server('127.0.0.1',8080,application)
print('server http on port ')
# 开始监听HTTP请求
httpd.serve_forever()
优化代码

软件开发目录规范

代码解耦

如下就相当于一个简单的web框架

urls.py----路由分配

views.py----

---------------------------------------------------------------------------------------------------------

扩展框架关于数据库的操作(核心)

-----------------------------------------------------------------------------

web框架 总结

main.py: 启动文件,封装了socket

1 urls.py: 路径与视图函数映射关系  ---- url控制器

2 views.py 视图函数,固定有一个形式参数:environ -----视图函数,

3 templates文件夹: html文件   -----模板

4 models: 在项目启动前,在数据库中创建表结构    ----- 与数据库相关

 

转载于:https://www.cnblogs.com/foremostxl/p/9937519.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值