首页 > 其他分享 >flask-02

flask-02

时间:2022-12-11 11:13:42浏览次数:54  
标签:02 __ socket flask start environ data

一、web框架原理

0、web框架简单说:就是请求对象响应对象

1、bs架构:B=浏览器、桌面端、小程序、app,     S=服务器

2、最开始使用socket写一个服务端,接收的http请求,然后做一些判断执行视图函数

最初代码演示:获取当前时间

  • 基于socket写一个服务端
import socket

def server_run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8008))
    soc.listen(5)
    while True:
        conn, addr = soc.accept()
        recv_data = conn.recv(1024)
        print(recv_data)
        # 1 直接在send里写,发送给客户端
        # conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>')
        #2 打开一个html文件,发送给客户端
        # with open('index.html','r',encoding='utf-8') as f:
        #     data=f.read()
        # conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
        # 3 动态网页,字符串替换
        import time
        now=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print(now)
        with open('index.html','r',encoding='utf-8') as f:
            data=f.read()
        data=data.replace('@@@',now)
        conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
        conn.close()

if __name__ == '__main__':
    server_run()

index页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

现在时间是:@@@

</body>
</html>

3、使用wsgiref写,他把socket都处理好了,只剩下处理路径和视图函数的匹配关系

  • 调用了make_sever模块
  • mya是可被调用的对象,能加括号执行的,

  • 能被调用的是:函数,类,对象加括号   咱们之前写的都是p=Person() 其实也可以p()这样会触发Person的__call__魔法方法

  • 无论是django还是flask都是用户浏览器发送http请求,经过web服务器,把请求拆成environstart_response传进后面django或者flask框架,最后响应完放进start_response经过wsgi变成响应的一套返回给前端

代码演示

from wsgiref.simple_server import make_server


def mya(environ, start_response):
    print(environ)  # environ 是http请求进入python后,被变成了字典
    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':
        with open('index.html', 'rb') as f:
            data = f.read()

    elif environ.get('PATH_INFO') == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
    else:
        data = b'<h1>Hello, web!</h1>'
    return [data]


if __name__ == '__main__':
    # mya是可被调用的对象,能加括号执行的,能被调用的是:函数,类,对象加括号   p=Person() ---> p()--->触发Person的__call__
    # 请求来了,会执行mya加括号,并把 environ, start_response 传进去,django,flask也这样
    myserver = make_server('', 8011, mya)
    print('监听8011')
    myserver.serve_forever()

4、flask基于werkzeug执行的

  • werkzeug在wsgi的基础上又做了一层封装,变得更简洁了,不需要传environ和start_response,直接传个request就可以,从request里拿path、GET、POST,都封装在request里了

二、flask展示用户信息案例

 

标签:02,__,socket,flask,start,environ,data
From: https://www.cnblogs.com/zzjjpp/p/16972880.html

相关文章