Python 框架之Flask初步了解

Python 框架之Flask初步了解

前言

​ 在了解python web 框架之前,我们需要先了解框架实现的基本原理。首先,需要了解WSGI(Web Server Gateway Interface),借助WSGI我们就能实现用Python专注于生成HTML文档,不用接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

​ WSGI将Web服务分成两个部分:服务器和应用程序。WGSI服务器只负责与网络相关的两件事:接收浏览器的HTTP请求、向浏览器发送HTTP应答;而对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。

这里写图片描述

Flask

  • Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理等功能库,以及它们所组成的整个生态系统。它倾向于对这些功能的实现方式不做任何限定。

  • 实验环境:win10、pycharm、anaconda2.4

  • 安装:

    由于安装了anaconda全家桶,所以已经自动包含了flask的框架。需要安装的话可以通过pip命令进行安装。

  • 试运行hello world

    在pycharm新建一个项目,配置相关python解释器,然后创建hello.py文件,写入如下代码:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
      return 'Hello world!'
    @app.route('/test')
    def test():
      return 'This is a test'
    
    if __name__ == '__main__':
      app.run()

    点击run的按钮,即可在浏览器输入127.0.0.1:5000,显示如下:

    这里写图片描述

  • 关于路由分发

    通过@app.route(‘xxx’)形式分配路由,如上代码,“/”表示访问站点根目录,即hello_world()函数,“/test”表示访问test()函数,通过这种新式我们可以很方便的给路由进行分组。

  • 关于变量规则

    如果希望获取/hello/1这样的路径参数,就需要使用变量规则。语法是/path/<converter:varname>。在变量前还可以使用可选的转换器,有以下几种转换器:

转换器作用
string默认选项,接受除了斜杠之外的字符串
int接受整数
float接受浮点数
path和string类似,不过可以接受带斜杠的字符串
any匹配任何一种转换器
uuid接受UUID字符串

  • 构建url

    使用函数 url_for() 来针对一个特定的函数构建一个 URL。它能够接受函数名作为第一参数,以及一些关键字参数, 每一个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中作为查询参数。

    如:

    from flask import Flask, url_for
    app = Flask(__name__)
    @app.route('/')
    def index():
        return 'Home page'
    
    
    @app.route('/login')
    def login():
      return 'Get login'
    
    
    @app.route('/user/<username>')
    def profile(username):
      return 'show user %s' % username
    
    with app.test_request_context():
      print url_for('index')
      print url_for('login')
      print url_for('profile', username='John Doe')
    
      if __name__ == '__main__':
          app.run()
  • HTTP方法

    首先需要引入request的包,route装饰器中会有相应的methods参数

    from flask import request
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
      if request.method == 'POST':
          do_the_login()
      else:
          show_the_login_form()
  • 静态文件的引入

    静态文件如css、js资源的引入需要在项目中创建static文件夹,用/static来引用访问。也可以给资源定义url

    url_for('static', filename='common.css')
  • 模板渲染

    引入render_template,模板文件需要放在templates 文件夹中,通过render_template()渲染模板。

    from flask import render_template
    
    @app.route('/hello/')
    @app.route('/hello/<name>')
    def hello(name=“”):
      return render_template('hello.html', name=name)
    • 模板继承

    • 设置可重写区域:

      
      # 以 {% block xx %} 开头
      
      
      # 以 {% endblock %} 结束
      
    • 继承:

      
      # 以 {% extends "base.html" %} 可继承base.html
      
      
      # 以 {{ super() }} 可获取父类内容
      
  • request 对象

    request 是一个全局对象。可通过request对象获取页面的传输数据。当前请求的方法可以用method属性来访问。你可以用 form 属性来访问表单数据,如:

    @app.route('/login', methods=['POST', 'GET'])
    def login():
      error = None
      if request.method == 'POST':
          if valid_login(request.form['username'],
                         request.form['password']):
              return log_the_user_in(request.form['username'])
          else:
              error = 'Invalid username/password'
      return render_template('login.html', error=error)
  • cookies

    from flask import request
    
    
    # cookies 的读取
    
    
    # 使用 cookies.get(key) 代替 cookies[key] 避免
    
    
    # 得到 KeyError 如果cookie不存在
    
    @app.route('/get')
    def index():
      username = request.cookies.get('username')
    
    
    # cookies 的发送
    
    @app.route('/set')
    def index1():
      resp = make_response(render_template(...))
      resp.set_cookie('username', 'the username')
      return resp
    
  • 重定向和错误

    重定向采用redirect()函数,错误中断采用abort()函数并指定一个错误代码(如404),通过 errorhandler()装饰器制定自定义错误页面。如:

    from flask import abort, redirect, url_for
    
    @app.route('/')
    def index():
      return redirect(url_for('login'))
    
    @app.route('/login')
    def login():
      abort(404)
      this_is_never_executed()

    错误界面:

    from flask import render_template
    
    @app.errorhandler(404)
    def page_not_found(error):
      return render_template('page_not_found.html'), 404
  • session 会话

    from flask import Flask, session, redirect, url_for, escape, request
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
      if 'username' in session:
          return 'Logged in as %s' % escape(session['username'])
      return 'You are not logged in'
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
      if request.method == 'POST':
          session['username'] = request.form['username']
          return redirect(url_for('index'))
      return '''
          <form action="" method="post">
              <p><input type=text name=username>
              <p><input type=submit value=Login>
          </form>
      '''
    
    @app.route('/logout')
    def logout():
      # remove the username from the session if it's there
      session.pop('username', None)
      return redirect(url_for('index'))
    
    
    # set the secret key.  keep this really secret:
    
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
    • 生成随机密钥:

    附上一些有用的说明,便于理解: urandom

    import os
    os.urandom(24)
  • 日志

    flask提供Logger,Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它,详情查阅官方文档 logging documentation

    app.logger.debug('A value for debugging')
    app.logger.warning('A warning occurred (%d apples)', 42)
    app.logger.error('An error occurred')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值