Flask入门

flask框架

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Falsk'

if __name__ == '__main__':
    app.run()

Flask类的参数

import_name: Flask程序所在的包,使用"__name__“即可
static_folder: 静态文件夹,默认为"static”
template_folder: 模板文件夹,默认为"templates"

app的配置加载

  • 对象加载
  • 文件加载(.ini)
  • 环境变量加载
# 对象加载方式
class Config(object):
    DEBUG = True

app = Flask(__name__)
app.config.from_object(Config)
# 文件加载方式
app.config.from_pyfile('../.../xxx.ini')
# 环境变量加载方式
# 需要预先设置环境变量(FLASKCFG)对应的配置文件地址
app.config.from_envvar('FLASKCFG')

获取配置

# app.config是个字典
app.config.get()
current_app.config.get()

app.run()的参数

# host设置为'0.0.0.0', 来作为外部可访问的服务器
# debug=True, 则修改代码后自动reload
app.run(host='0.0.0.0', port='5555', debug=True)

Manager

  • Flask服务器启动的时候,通过 命令行 的方式传入参数
from flask_script import Manager
# 关联manager和app
manager = Manager(app)
if __name__ == '__main__':
    manager.run()
##########################################
python hello.py runserver -d

路由

利用装饰器实现

指定请求方式

@app.route('/user', methods=['GET', 'POST'])
def user_info():
	if request.method == 'GET':
		return 'GET'
	return 'POST'

路由传参

@app.route('/user/<int:user_id>')
def user_info(user_id):
	return 'userid:{:}'.format(user_id)

正则匹配路由

app.url_map.converters['re'] = ReConverter
@app.route('/mobile/<re("1[3456789]\d{9}"):mobile>')
def mobile(mobile):
    return 'mobile:{:}'.format(mobile)

# 定义正则匹配类
from werkzeug.routing import BaseConverter
class ReConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super().__init__(url_map)
        self.regex = args[0]    # args[0]就是正则表达式

特殊对象

request对象

from flask import request
# 获取get请求的参数
user = request.args.get('user')

response对象

# 通过response对象添加返回头信息, 或者自定义返回状态码
@app.route('/resp')
def test_resp():
    resp = make_response('login')
    resp.status = '400 fail'
    resp.headers['city'] = 'beijing'
    return resp

cookie对象

  • 存储 不那么敏感 的数据,如网站的浏览足迹。
  • 由服务端生成,在浏览器端以 纯文本形式 存储存储。
  • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
response.set_cookie('name', 'zs', max_age=3600)
request.cookies.get('name')

session对象

  • 存储 敏感重要 的数据,如余额、验证码等。
  • 在服务端进行状态保持。
from flask import session
session['name'] = user.id  # 记录用户信息
session.get('name') # 获取用户信息

记得设置secret_key: app.secret_key = ‘xxxx’

应用上下文对象

from flask import current_app, g
print(current_app)  # 存储应用程序中的变量,如配置信息等
print(g) # 当前请求的全局变量,通过它可以传递一些数据

特殊方法

redirect()重定向方法

# url_for通过视图函数反查url, 可拼接参数
# redirect重定向到url对应的视图函数去执行
from werkzeug.utils import redirect
@app.route('/redirect')
def test_redirect():
    # return redirect('https://learn.kaikeba.com/')
    return redirect(url_for('user', user_id=111))

jsonify()字典转json方法

# 中文显示需配置 JSON_AS_ASCII = False
@app.route('/json')
def get_json():
    json_dict = {
        'user_id': 1,
        'user_name': 'laowang'
    }
    # return jsonify(json_dict)
    return jsonify(code='200', msg='登录成功')

abort()抛出异常方法

# abort抛出异常状态码
@app.route('/error')
def test_error():
    return abort(404)

# 利用装饰器定义状态码对应的处理方法
@app.errorhandler(404)
def hander(e):
    return '页面找不到'

请求勾子函数

做一些准备工作以及扫尾工作

# 处理第一个请求前执行
@app.before_first_request
def bfr():
    print('before_first_request')

# 在每次请求前执行
# 如果在某被装饰的函数中返回了一个响应,则视图函数将不再被调用
@app.before_request
def br():
    print('before_request')

# 如果没有抛出错误,在每次请求后执行
# 接收来自视图函数作出的响应response,进一步处理后返回response
@app.after_request
def ar(response):  
    print('after_request')
    return response

# 在每次请求之后执行
# 接收一个参数:错误信息,如果有错误抛出
@app.teardown_request
def tr(e):
    print('teardown_request')

模板

from flask import render_template
render_template('html/index.html', data={'date': '2021-08-23', 'api': 'album'})

代码块

{{ data.date }}  # 变量代码块
<a href="{{ url_for('index') }}" class="{% if data.api=='index' %}active{% endif %}">文章</a> # 控制代码块
{# ... #}  # 注释代码块

过滤器

字符串过滤器

  • safe:禁用转义
  • capitalize:把变量值的 首字母转成大写,其余字母转小写
  • lower:把值转成小写
  • upper:把值转成大写
  • title:把值中的 每个单词 的首字母都转成大写
  • reverse:字符串反转
  • format:格式化输出
  • striptags:渲染之前把值中所有的 HTML标签都删掉

列表过滤器

  • first:取第一个元素
  • last:取最后一个元素
  • length:获取列表长度
  • sum:列表求和
  • sort:列表排序

自定义过滤器

# 自定义过滤器
@app.template_filter('title_last')
def title2(string):
    newString = ''
    for word in string.split():
        newString += word[:-1]
        newString += word[-1].upper()
        newString += ' '
    newString = newString[:-1]
    return newString
###########################################################
<p class="text">{{ data.welcome | title_last }}</p>

模板继承

# 1.在父模板base.html中挖坑
{% block content %} 
	待填充部分
{% endblock %}
########################################################
# 2.子模版继承后,填充父模板挖坑部分
{% extends 'base.html' %}
{% block content %}
    需要填充的内容
{% endblock content %}

表单

数据库

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

定义数据模型

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64), unique=True)
    password = db.Column(db.String(64))

插入数据

if __name__ == '__main__':
    db.create_all()  # 一定要先创建表结构
    user1 = User(name='zs', password='123')
    user2 = User(name='李四', password='1234')
    db.session.add_all([user1, user2])
    db.session.commit()
    app.run(host='0.0.0.0', port='5555', debug=True)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值