IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> simple_server 搭建简易后端服务 -> 正文阅读

[Python知识库]simple_server 搭建简易后端服务

当我们在浏览器上请求我们的后台服务时,请求的url和请求的参数params会发送给后台,并被保存在后台程序的系统环境变量中,其中前端请求的url保存着在’PATH_INFO‘中,请求的参数保存在‘QUERY_STRING’中?,我们后台服务可以从env中去取出请求数据然后逻辑处理。

env:系统的环境变量

env.get('PATH_INFO'): 获取环境变量中的请求url路由.

env.get("QUERY_STRING"):获取环境变量中get请求的字符串参数params.

from wsgiref.simple_server import make_server


def app(env, start_response):
    # env代表本地环境变量,dict类型
    # {'PATH': '/Users/jt/python_env/flask_demo/venv/bin,'MANPATH': '/opt/homebrew/share/man::',
    # 'WORKON_HOME': '/Users/jeanettian/python_env'}
    # print(env)
    print(env.get('PATH_INFO'))
    if env.get('PATH_INFO') == '/login':
        start_response('200 ok', [('content-type', 'text/plain')])
        return [b'this is login view']  # b:byte
    elif env.get('PATH_INFO') == '/register':
        start_response('200 ok', [('content-type', 'text/plain')])
        return [b'his is register view']  # b:byte
    elif env.get('PATH_INFO') == '/index':
        start_response('200 ok', [('content-type', 'text/plain')])
        return [b'his is index view']  # b:byte
    elif env.get('PATH_INFO') == '':
        start_response('200 ok', [('content-type', 'text/plain')])
        return [b'{name: chuntian!,age:4}']  # b:byte
    else:
        start_response('404 not found', [('content-type', 'text/plain')])
        return [b'404 page not found']  # b:byte


server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()

1.浏览器访问login时:

?2.浏览器访问register时:

3.浏览器访问index时:

4.浏览器访问' /'时:

5.浏览器访问不存在的路由时:

路由集中式管理:字典实现switch(){}?

上面的代码有个问题,出现多个if xxx == xxx的条件分支的时候,每个分支都是一条逻辑判断,显得过于冗余,我们可以利用python中的字典来实现其他变成语言里的switch(){}语句,达到使代码更加优雅的目的,也使以后修改路由更加方便,直接修改字典内容,不需要修改主逻辑,

from wsgiref.simple_server import make_server


def login():
    return 'login'


def register():
    return 'register'


def index():
    return 'index'


def home():
    return '{"name": "chuntian", "age": 4}'


pattern_url = {
    "/": home,
    "/login": login,
    "/register": register,
    "/index": index
}


def app(env, start_response):
    url = env.get('PATH_INFO')  # 字典的get方法若没找到对应的键,则会返回None,比dict['key']更好
    if url is None or url not in pattern_url.keys():
        start_response('404 not found', [('content-type', 'text/plain')])
        return [b'404 page not found']

    res = pattern_url.get(url)
    if res is None:
        start_response('404 not found', [('content-type', 'text/plain')])
        return [b'404 page not found']

    start_response('200 ok', [('content_type', 'text/palin')])
    return [res().encode()]


server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()

获取请求的url和参数

from wsgiref.simple_server import make_server


def login(request):     # 程序获取到的params可传递给request
    return request


def register(request):
    return request


def index(request):
    return request


def home(request):
    return request


pattern_url = {
    "/": home,
    "/login": login,
    "/register": register,
    "/index": index
}


def app(env, start_response):
    url = env.get('PATH_INFO')  # 字典的get方法若没找到对应的键,则会返回None,比dict['key']更好
    params = env.get('QUERY_STRING')
    if url is None or url not in pattern_url.keys():
        start_response('404 not found', [('content-type', 'text/plain')])
        return [b'404 page not found']

    res = pattern_url.get(url)
    if res is None:
        start_response('404 not found', [('content-type', 'text/plain')])
        return [b'404 page not found']

    start_response('200 ok', [('content_type', 'text/palin')])
    return [res(params).encode()]   # 获取到的params会作为参数传递给触发的函数方法中的行参request被打印出来


server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()

?以上返回的都是text/plain格式的,那如果我们想返回的是一个html或者json数据,怎么办?

答案:可以通过content-type来指定返回的类型,如:

[('content-type', 'text/html')]

[('content-type', 'application/json')]

?WSGI协议其实就是CGI协议的升级:在webserver和application中间起到桥梁作用。

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:08:24  更:2022-03-03 16:10:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:35:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码