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中间起到桥梁作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chuntian_tester

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值