Flask 介绍

repr函数代替str函数

def __repr__(self):
    return "直接输出&print调用"

创建数据库

CREATE DATABASE my_database default charset utf8 COLLATE utf8_general_ci;
GRANT ALL ON my_database.* TO 'username'@'127.0.0.1' IDENTIFIED BY 'pass_word';
GRANT ALL ON my_database.* TO 'username'@'localhost' IDENTIFIED BY 'pass_word';
GRANT ALL ON my_database.* TO 'username'@'%' IDENTIFIED BY 'pass_word';

修改默认的静态文件目录

app = Flask(__name__, static_folder='files')

错误处理

使用”abort()”函数可以直接退出请求,返回错误代码:

from flask import abort

@app.route('/error')
def error():
    abort(404)

上例会显示浏览器的404错误页面。有时候,我们想要在遇到特定错误代码时做些事情,或者重写错误页面,可以用下面的方法:

@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404

此时,当再次遇到404错误时,即会调用”page_not_found()”函数,其返回”404.html”的模板页。第二个参数代表错误代码。

更常见的方式

# 定义异常类
class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=400):
        Exception.__init__(self)
        self.message = message
        self.status_code = status_code

 # 异常类响应事件
@app.errorhandler(InvalidUsage)
def invalid_usage(error):
    response = make_response(error.message)
    response.status_code = error.status_code
    return response

 # 抛出异常类的测试
@app.route('/exception')
def exception():
    raise InvalidUsage('No privilege to access the resource', status_code=403)
URL重定向

作用就是当客户端浏览某个网址时,将其导向到另一个网址。常见的例子,比如用户在未登录时浏览某个需授权的页面,我们将其重定向到登录页要求其登录先。

from flask import session, redirect
@app.route('/')
def index():
    if 'user' in session:
        return 'Hello %s!' % session['user']
    else:
        return redirect(url_for('login'), 302)

“redirect()”的第二个参数时HTTP状态码,可取的值有301, 302, 303, 305和307,默认即302

日志处理

Flask提供logger对象,其是一个标准的Python Logger类。

@app.route('/exception')
def exception():
    app.logger.debug('Enter exception method')
    app.logger.error('403 error happened')
    raise InvalidUsage('No privilege to access the resource', status_code=403)

在debug模式下,日志会默认输出到标准错误stderr中。你可以添加FileHandler来使其输出到日志文件中去,也可以修改日志的记录格式

server_log = TimedRotatingFileHandler('server.log','D')
server_log.setLevel(logging.DEBUG)
server_log.setFormatter(logging.Formatter(
    '%(asctime)s %(levelname)s: %(message)s'
))

error_log = TimedRotatingFileHandler('error.log', 'D')
error_log.setLevel(logging.ERROR)
error_log.setFormatter(logging.Formatter(
    '%(asctime)s: %(message)s [in %(pathname)s:%(lineno)d]'
))

app.logger.addHandler(server_log)
app.logger.addHandler(error_log)

另外,这里使用了”TimedRotatingFileHandler”并给了参数”D”,这样日志每天会创建一个新的文件,并将旧文件加日期后缀来归档。
还可以将错误信息发送邮件。更详细的日志使用可参阅Python logging官方文档

消息闪现

“flash()”方法的第二个参数是消息类型,可选择的有”message”, “info”, “warning”, “error”。你可以在获取消息时,同时获取消息类型,还可以过滤特定的消息类型。只需设置”get_flashed_messages()”方法的”with_categories”和”category_filter”参数即可。比如,Python部分可改为:

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        session['user'] = request.form['user']
        flash('Login successfully!', 'message')
        flash('Login as user: %s.' % request.form['user'], 'info')
        return redirect(url_for('index'))

layout模板部分可改为:

{% with messages = get_flashed_messages(with_categories=true, category_filter=["message","error"]) %}
  {% if messages %}
    <ul class="flash">
    {% for category, message in messages %}
      <li class="{{ category }}">{{ category }}: {{ message }}</li>
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}

加载配置

from flask import Flask
import config

app = Flask(__name__)
app.config.from_object('config')

请求上下文装饰器

before_request可以有多个,按照从上到下的顺序调用
after_request、teardown_request也可以有多个,按照从下到上的顺序调用
g变量是一个应用上下文

@app.before_request
def before_request():
    """进入请求前执行,可以用来开启数据库连接"""
    print('before request started')
    print(request.url)
    g.name="SampleApp"

@app.after_request
def after_request(response):
    """正常执行完请求时执行,接收response返回response"""
    print('after request finished==============')
    print(request.url)
    response.headers['status'] = 'good1'
    return response

@app.teardown_request
def teardown_request(exception):
    """不论是否正常执行完请求都执行,可以用来关闭数据库连接"""
    print('teardown request==============')
    print(request.url)
    print(exception)

灵活使用视图类

from flask.views import MethodView

class RenderTemplateView(View):
    decorators = [login_required] #视图装饰器
    methods = ['GET', 'POST'] #默认只有GET

    def __init__(self, template):
        self.template = template

    def dispatch_request(self):
        return render_template(self.template)

app.add_url_rule('/hello', view_func=RenderTemplateView.as_view('hello', template='hello-view.html'))
app.add_url_rule('/login', view_func=RenderTemplateView.as_view('login', template='login-view.html'))

基于方法的视图类

from flask.views import MethodView

class UserAPI(MethodView):
    def get(self, user_id):
        if user_id is None:
            return 'Get User called, return all users'
        else:
            return 'Get User called with id %s' % user_id

    def post(self):
        return 'Post User called'

    def put(self, user_id):
        return 'Put User called with id %s' % user_id

    def delete(self, user_id):
        return 'Delete User called with id %s' % user_id

user_view = UserAPI.as_view('users')

app.add_url_rule('/users/', view_func=user_view, defaults={'user_id': None}, methods=['GET',])

app.add_url_rule('/users/', view_func=user_view, methods=['POST',])

app.add_url_rule('/users/<user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值