美文网首页
Python || Web框架

Python || Web框架

作者: 有个水友 | 来源:发表于2017-02-13 15:07 被阅读31次

    一、仅使用WSGI接口的限制

    本质上,写一个Web App就是写一个WSGI处理函数(根据请求的内容,生成相应的HTML代码),然后利用符合WSGI规范的服务器调用处理函数,完成对每个请求的响应。(隐藏了HTTP原始请求和响应、HTTP请求的解析)

    如何请求的问题结局后,怎么处理不同的URL、相同URL的不同请求类型(POSTGETHEADDELETE等)仍待解决。

    简单的想法是:挨个判断传入的HTTP请求的URL及请求类型

    def application(environ, start_response):
      method = environ["REQUEST_METHOD"]
      path = environ["PATH_INFO"]
      #根据请求的类型及路径,分别执行不同的处理函数
      if method=="GET" and path=="/":
        return handle_home(environ, start_response)
      if method=="POST" and path=="/signin":
        return handle_signin(environ, start_response)
      ...
    

    但是这样有个明显的缺点,当逻辑复杂后,代码很难维护。需要在WSGI接口的基础上,再抽象出一个函数专注于处理URL,而URL到与之对应处理函数之间的映射由Web框架来实现。

    二、使用Flask开发一个简单的Web App

    功能:处理三个URL

    • GET /:首页,返回HOME;
    • GET /signin:登录页,显示登录页表单;
    • POST /signin:处理登录表单,显示登录结果。
    • 同一个URL/signin分别有两种请求,映射到两个处理函数。GET请求的处理函数是返回表单的HTML源码,显示在浏览器中;POST请求的处理函数是验证登录信息,返回相应的结果。
    from flask import Flask
    from flask import request
    app = Flask(__name__)
    #======================================================================
    #主页
    @app.route('/', methods=["GET", "POST"])
    def home():
        return "<h1>Hello, in my home!</h1>"
    #======================================================================
    #表单页
    @app.route("/signin", methods=["GET"])
    def signin_form():
        return '''<form action="/signin" method="POST">
                  <p><input name="username"></p>    
                  <p><input name="password" type="password"></p>
                  <p><button type="submit">Sign In</button></p>
                  </form>
               '''
    #======================================================================
    #登录页
    @app.route("/signin", methods=["POST"])
    def signin():
        #get information from object request
        if request.form['username'] == "admin" and request.form['password'] == "password":
            return "<h3>Hello admin!</h3>"
        return "<h3>Bad username or password</h3>"
    #======================================================================
    #启动服务
    if __name__ == "__main__":
        app.run()
    

    相关文章

      网友评论

          本文标题:Python || Web框架

          本文链接:https://www.haomeiwen.com/subject/atxtwttx.html