Python Web Flask框架学习(一)

Flask使用Werkzeug作为WSGI工具库,Jinja2作为模板页面语言

参考

安装Flask

  • 使用命令
    pip install flask

一个简单的Hello World页面

  • from flask import *
    
    app = Flask(__name__) # 创建flask对象
    
    
    @app.route('/') # 指定方法对应的url
    def hello_world():
        return 'hello world'
    
    
    if __name__ == "__main__":
        app.run(debug=True) # 启动web应用程序,开启debug模式
  • 在创建flask对象可以更换为其他名称,官方建议传入“__name__”,以免输入错误或重复的名字使flask无法调用模块
  • 在每个方法前使用.route()方法设定url,作用类似于.NET中的RouteConfig

URL路由

  • 使用route()方法将一个方法与URL绑定
    @app.route('/show/')
    def show_test():
        return 'something'
  • 在传入的URL字符串中添加形如“<变量名>”的方式来实现传递变量
    @app.route('/show/<something>') # 这个变量类型为字符串
    def show_test(something):
        return something
    
  • route方法默认变量类型为字符串,除此之外可以以“<Converter:变量名>”的形式来指定变量的类型。除string外,Converter可以为int、float、path和uuid,分别接受正整型、正浮点数、字符串(带斜杠)和UUID字符串。
  • 可能成为坑点【唯一网址/重定向行为】
    • URL后加不加斜杠是有区别的,例如
      @app.route('/slash/')
      def slash():
          return "This is a slash page"
      
      
      @app.route('/nonslash')
      def non_slash():
          return "This is a non-slash page"
    • 此时访问slash无论你输入的URL末尾是否有斜杠,都会自动重定向到带斜杠的URL,因为在绑定slash方法时末尾加了斜杠
    • 再尝试访问nonslash 可以看到当路由绑定没有加斜杠时,尝试访问带斜杠的URL会404。官方说明:This helps keep URLs unique for these resources, which helps search engines avoid indexing the same page twice. 防止搜索引擎重复索引一个页面两次。
  • 使用url_for()方法来拼接URL
    with app.test_request_context():
        print(url_for("hello_world"))
        print(url_for("show_digit", digit=1))
    
    # Shell输出对应URL
    # /
    # /show/1

HTML的GET和POST方法

  • 在使用route方法绑定URL时,传入参数metods来指定GET或POST方法
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST': # 用request.method判断GET或POST请求
            return "POST"
        else :
            return "GET"
  • 默认情况下,一条路线只对GET请求作出回应(原文:By default, a route only answers to GET requests.)

生成静态文件

  • 在包内或与模块同级的目录下新建static文件夹,然后使用url_for()方法生成静态文件
    url_for('static', filename='style.css')
  • 文件会被存储在static文件夹下

载入模板

  • 这里用到了Jinja2,其功能很像.NET中的Razor。在Razor中使用@来嵌入C#代码,而Jinja有自己的规定,具体可以查阅官网文档。其中“{%  %}”用于声明(if、for语句),“{{  }}”用来在模板中打印(输出数据)
  • 与static文件夹一样,新建一个templates文件夹,将写好的模板页面放入templates文件夹,然后使用代码载入
    @app.route("/hello/")
    @app.route("/hello/<name>")
    def hello(name=None):
        return render_template("hello.html", name=name)

    这里的hello方法具有一个name变量,hello模板页面代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello page</title>
    </head>
    <body>
        <h2>
            This is a Hello Page
        </h2>
        {% if name %}
        <p>
            Hello, {{name}}
        </p>
        {% else %}
        <p> Hello World</p>
        {% endif %}
    </body>
    </html>
  • 尝试访问 可以看到没有传入参数与传入参数时显示的内容是不同的,Jinja作用于此