day56-flask框架基础

1最小flask应用

1.1安装flask

virtualenv --no-site-packages flaskenv8
pip install flask

然后新建一个空文件夹,用pycharm打开,然后在空文件夹中创建一个py文件

1.2最小应用

from flask import Flask
app = Flask(__name__)
@app.route('/hel/')
def hello():
    return 'hello wrold'
if __name__ == '__main__':
    app.run()

最小应用代码注释
1.导入Flask类
2.生成一个flask的对象,传入name参数,表示模块名或包名
3.告诉服务器,访问127.0.0.1:5000/hel/地址可触发hello方法;类似django中的urls.py文件的功能
6.直接启动本文件,才执行app.run()

1.3启动最小应用

if __name__ == '__main__':
    ip = sys.argv[1]
    port = sys.argv[2]
    app.run(host=ip, port=port, debug=True)

host代表启动时的ip地址;port代表启动的端口;debug代表启动的模式,debug=True为调试模式; ctrl+s后会自己启动项目。
可以直接用1.2节中的app.run()直接启动应用,但是,这样就不能修改ip和端口,而用本方法能够修改ip和端口。启动指令为python hello.py 0.0.0.0 82(文件名+ip+端口)

1.4使用manage启动文件

先安装flask_script库

pip install flask-script

设置manage

from flask import Flask
from flask_script import Manger
manage=Manage(app)
@blue.route('/hello/')
def hello():
    return '还有几天放假
if __name__ == '__main__':
    manage.run()

manage = Manager(app):管理flask应用对象app
启动命令

python manage.py runserver -h 0.0.0.0 -p 80 -d

-h 表示ip地址 ;-p表示端口 -d表示debug模式
flask-script - 管理启动命令
flask-blueprint - 管理路由地址

2拆分视图函数

背景:模块化管理路由地址
安装蓝图库

pip install flask-blueprint

初始化蓝图对象,并使用对象管理路由

blue = Blueprint('first', __name__)

管理路由:@blue.route('/hello/')

@blue.route('/hello/')
def hello():
    return '还有几天放假'

在manage页面注册蓝图

app.register_blueprint(blueprint=blue, url_prefix='/app')

第一个参数为引入的blue对象,第二个参数为路由的前缀;
当页面出现cannot import 。。(不能导入某数据时)原因为两个页面出现互相引用

3路由规则

在flask中也可以在路由后面接参数;格式为<转换器:参数>
<int:id> 表示接受的id值为int类型
<string:name> 表示接收的name参数为string类型,可简写为<name>类型
<float:num> 表示接收的num参数为浮点类型
<uuid:uid> 表示接收的uid参数为uuid类型值
<path:path> 表示接收的p变量为路径

@blue.route('/stu/<int:id>/')
def stu(id):
    print(type(id))
    return 'hello stu id:%d' % id

@blue.route('/name/<string:name>/')
def stu_name(name):
    print(type(name))
    return 'welcome stu:%s' % name

@blue.route('/float/<float:num>/')
def float_num(num):
    print(type(num))
    # return 'float num:%s' % num #将小数当成字符串输出
    return 'float num:%.2f' % num   将小数保留两位小数输出

@blue.route('/get_uuid/')
def get_uuid():
    import uuid
    return 'uuid:%s' % str(uuid.uuid4())

@blue.route('/uuid/<uuid:uid>/')
def uid(uid):
    return 'uid:%s' % uid

@blue.route('/path/<path:p>/')
def get_path(p):
    return 'path:%s' % p

4重定向

重定向分为直接重定向和反向解析重定向两种

4.1直接重定向

@blue.route('/redirect_hello/')
def redirect_hello():
    return redirect('/app/hello/')

直接重定向由路由的绝对路径构成

4.2反向解析重定向

反向解析重定向由url_for来完成,其形式为url_for('生成蓝图的第一个参数.重定向的函数名'),又可分为无参跳转和有参跳转两种

@blue.route('/redirect_hello/')
def redirect_hello():
    return redirect(url_for('first.hello'))

@blue.route('/redirect_hello/')
def redirect_hello():
    return redirect(url_for('first.float_num', num=10.1))

5错误抛出与捕获

1导包:from flask import abort
2使用:abort(500)
捕获:@blue.errorhandler(500)
抛出错误码时,错误码必须符合http定义的状态码,且抛出的错误码要符合运用场景

@blue.route('/index/')
def index():
    try:
        1/0
    except Exception as e:
        abort(500) # 抛出500错误
    return 'hello'

抛出错误并捕获500错误
@blue.errorhandler(500)
def error_500(e):
    return 'exception :%s' % e

6页面渲染

html模板文件需存在于templates文件夹下,且templates和manage.py文件同级

@blue.route('/my_index/', methods=['GET', 'POST', 'PATCH'])
def my_index():
    if request.method == 'GET':
        return render_template('index.html')
    if request.method == 'POST':
        pass

页面渲染:render_template('index.html')
请求方式:@blue.route('/my_index/', methods=['GET', 'POST', 'PATCH']),不写methods时默认为get

7请求与响应

7.1获取前端传回的数据

当为get请求方式时,获取从前端传回的参数使用args获取
request.args.get(key)
request.args.getlist(key)
前者只获取一个值,后者会将所有传递过来参数名为key的组成一个列表返回
当请求方式为post/put/patch/delecte时,获取数据用form获取
request.form.get(key)
request.form.getlist(key)
同args一样,前者也只取一个值,后者取key对应的所有值并组成一个列表

7.2获取请求方式

request.method

7.3获取路由

request.path

7.4获取cookie

request.cookies

7.5获取文件

request.files

7.6响应

创建响应:make_response(响应内容,响应状态码),状态码默认200,可不写
设置cookie: 响应对象.set_cookie(key, value, max_age)
删除cookie:响应对象.delete_cookie(key)
响应字符串

@blue.route('/response/', methods=['GET'])
def get_response():
    res = make_response('<h3>2019</h3>', 200)
    return res

响应模板文件

@blue.route('/response/', methods=['GET'])
def get_response():
    html = render_template('index.html')
    res = make_response(html, 200)
    res.set_cookie('token', '09876543210', max_age=100)
    res.delete_cookie('token')
    return res
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容