Flask框架一些小应用

芜湖~来了老弟~终于到了flask,keep moving


下面我们来实现 Flask 框架的第 1 个应用程序,在浏览器中显示“ Hello World!
from flask import Flask

# 创建Flask实例
app = Flask(__name__)
# 为了方便调试我们把debug打开,避免频繁修改还要开启关闭
app.debug = True

# 路由分发
@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

if __name__ == '__main__':
    # 在测试环境下开启服务
    app.run()

(1)首先,我们导入了 Flask 类,该类的实例将会成为我们的 WSGI 应用;

(2)接着,我们创建一个该类的实例对象。第一个参数是应用模块或者包的名称。若你使用一个单一模块(就 像本例),那么应当使用__name__,因为名称会根据这个模块来按应用方式使用、还是作为一个模块导入而发生 变化(可能是"__main__",也可能是实际导入的名称)。这个参数是必需的,这样 Flask 才能知道在哪里可以找到模 板和静态文件等内容;

(3)然后,我们使用 route()装饰器来告诉 Flask 触发函数的 URL 地址;

(4)函数名称被用于生成相关联的 URL,函数最后返回需要在用户浏览器中显示的信息;

(5)最后,使用 run()函数用于启动应用程序的服务器。

 与  Django不同的是flask这个py文件可以直接run运行,或者输入命令:python py名.py  运行

而且flask框架的端口号默认是5000,也可修改

改端口在主函数下的app.run()中修改  可        app.run(port=XXX)


对设置flask中的参数内容,通常是用于读取并设定某文件已有的配置内容

文件设置,在项目下新建一个config文件夹,再创建一个config.conf文件

 (app.py)文件引入:

app.config.from_pyfile("./config/config.conf")

 config.conf文件中设置

DEBUG = True

若要使用装饰器来装饰视图函数,则需要使用 route()函数,该函数第 1 个参数表示路由网址 url 值。若使用 相同的装饰器值来装饰多个不同的视图函数,会出现什么情况呢?

@app.route('/python/')
def hello_python():
    return 'hello python 666!'

@app.route('/python/')
def hello_java():
    return 'hello java 666!'

在 Flask 应用中,若要查看所有网址信息内容,则可以使用 Flask 对象的 url_map 属性进行查看

if __name__ == '__main__':
    print("所有路由执行地址",app.url_map)
    # 在测试环境下开启服务
    app.run()

我们可以发现,如果使用同一个装饰器装饰多个视图时,显示的效果是第 1 个视图函数的内容值。


当同一个视图函数使用多个的装饰器来装饰时,会出现什么情况呢?

@app.route('/test1/')
@app.route('/test2/')
def test():
    return "this is test"

此时,我们可以发现,如果使用同一个视图函数使用多个的装饰器来装饰时,不同的装饰器对应的路由网址 可显示出视图函数的不同内容。


限制请求方式 针对给某个视图函数设定路由网址,正常情况下,默认是 GET 请求方式

@app.route('/get/')
def get():
    return "默认显示GET请求"

此时要改变 get()视图函数的请求方式为 POST

@app.route('/get/', methods=["pOST"])
def get():
    return "默认显示GET请求"


解析网址与传递参数之使用 url_for 反解析网址

redirect(location,
code=302,...)
用于重定向到具体的路由网址。参数内容作如下说明:
①参数 location 表示路由的链接地址,可以使用 url_for() 函数得到,也可以是静态文件
地址;
②参数 code 表示响应状态码,可以取值为 301 302 303 305 307 等,默认值为 302
@app.route('/redirect/')
def redirect_index():
    return redirect("http://www.baidu.com")

一执行页面就会跳到百度去   http://127.0.0.1:5000/redirect/  

实际应用中,可能更多的是重定向到开发者自己开发的网址中,此时,就可以传递具体的静态路由 网址,下面来到 redirect_index()函数中直接重定向跳转至hello_python()视图函数中 

@app.route('/redirect/')
def redirect_index():
    # return redirect("http://www.baidu.com")
    return redirect(url_for('hello_python'))

 啪的一下!很快的啊!


解析网址与传递参数之传递参数

int
传递的参数类型为整数类型,若不设定参数类型值,通常默认为字符串类型的值。
float
传递的参数类型为浮点数类型。
path
与默认什么类型都不设定情况一致,但若设定了则也可接受斜杠 ( /)
@app.route('/params/<int:bookid>')
def get_bookid(bookid):
    print(type(bookid))
    return "接收结果为:%d" % bookid


解析网址与传递参数之 自定义转换器
下面来定义一个视图函数,用于接收 11 位数的手机号码,且手机号第 2 位可能为 345789 ,则编写程序如下

# 自定义参数类型转换器
class MyRegex(BaseConverter):
    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex


# 注册类型自定义转换器
app.url_map.converters['regex'] = MyRegex


@app.route("/user/<regex('1[345789]\d{9}'):phone>")
def get_uesr_phone(phone):
    return f'用户的手机号是:{phone}'


flask之上传文件

若要将已上传的文件存储在内存或是文件系统中一个临时的位置,则可以通过请求对象的 files 属性访问。 每个上传的文件都会存储在这个字典里,它表现近乎为一个标准的 Python file 对象,此外还可以使用 save()函数, 这个方法允许你把文件保存到服务器的文件系统上。下面使用它来保存文件,代码如下

@app.route('/upload', methods=['POST'])
# http://127.0.0.1:5000/static/uploadImg.html
def upload():
    file_obj = request.files.get('picture')
    if not file_obj:
        return "未上传图片"
    else:
        file_obj.save("./static/images/1.jpg")
        return "images save ok"

另外,创建static目录,在目录下创建uploadImg.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="picture">
    <input type="submit" value="上传">
</form>
</body>
</html>

没传:

传了:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值