温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python Web框架学习【Flask】

发布时间:2020-02-28 06:37:50 来源:网络 阅读:405 作者:流域哈哈 栏目:编程语言

了解flask

flask 是利用Python编写的轻量级Web应用框架
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。

Flask没有默认使用的数据库、窗体验证工具。
其 WSGI 工具箱采用 Werkzeug   模板引擎则使用 Jinja2   Flask使用 BSD 授权
WSGI(PythonWeb服务器网关接口)

Python Web Server Gateway Interface
Python应用程序或框架和Web服务器之间的一种接口


BSD开源协议

一个给于使用者很大自由的协议,BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。


利用flask实现一个最小应用

创建一个.py文件(test.py),添加代码如下:
# 导入Flask类,该类的实例将作为我们的WSGI应用
from flask import Flask
# 实例化Flask类,第一个参数应当是包或者模块名,单一模块使用__name__即可
app = Flask(__name__)

# route装饰器用于确定触发函数的url
@app.route('/')
def index():
# 函数的返回值为用户在浏览器中获取的值
    return 'Hello World'
运行可以直接在代码中调用run方法,然后执行该.py文件即可
app.run(host='0.0.0.0', port=5000) 
# 0.0.0.0开放所有ip,port用于指定端口
# host指定开放ip,port指定端口号,默认127.0.0.1(回环地址)5000端口
或者在命令行中导出环境变量,然后执行
export FLASK_APP=test.py # 非当前目录下须添加绝对路径
flask run # 运行
此时利用浏览器访问ip+端口(如127.0.0.1:5000),可以看到Helloworld字符

注意在浏览器访问时,ip后须加端口号,如果不加,默认使用http服务(80端口)

Python Web框架学习【Flask】


设置路由

web应用使用有意义的url,有助于用户理解记忆,提高用户体验
例如: 
            百度主页:www.baidu.com
            百度新闻:news.baidu.com
            百度贴吧:tieba.baidu.com

上面我们用到的route装饰器就是用来绑定url和函数

例如下面这一段表示,用户访问ip/时触发的函数为index
@app.route('/')
def index():
    return 'Hello World'
此外,还可以动态变化url

利用<variable_name> 的方式,将url的一部分标记为变量,并传递给函数
@app.route('/<username>')
def user():
    return 'Hello %s'%username # 根据url变量部分返回字符串
还可以利用<converter:variable_name>,选择转换器,为变量指定规则
@app.route('/<int:username>') # 指定变量为整型
def user():
    return 'Hello %s'%username

Python Web框架学习【Flask】


模板渲染

当我们需要向用户返回一个完善的html页面时
如果将html源码全部贴在return后面显然会让人头疼

Flask自动为我们配置Jinja2模板引擎
我们可以利用render_template调用模板,并传入参数进行渲染
@app.route('/user/')
def user():
    username = 'testUser' # 测试数据
    return render_template('user.html',user=username)
第一个参数为需要调用的html模板,后面传入关键字参数
在html中利用关键字访问数据

render_template默认会从当前目录下的templates文件夹中寻找模板

Python Web框架学习【Flask】

user.html中添加一个p标签,利用‘{{user}}‘的形式显示user参数的值

Python Web框架学习【Flask】

利用浏览器访问

Python Web框架学习【Flask】


模板继承

大多情况下,同一个域名下的各个子页面风格大致相同,具有相同的框架
比如同样的导航栏,底部等等

为避免重复工作,可以制作一个共用的基础模板,然后通过模板继承来实现共用框架
基础模板
基模板(base.html)中写好了头部和尾部,在身体部分放置了可以重载的块
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2 >我是模板头部</h2>

{% block body %}
<p>可重载部分</p>
{% endblock %}

<h2 >我是模板尾部</h2>

</body>
</html>
子模板(use_base.html)
{% extends "base.html" %} <--! 扩展了基础模板 -->
{% block body %}
<p >
    这是子模板新加入的内容
</p>
{% endblock %}
访问页面

Python Web框架学习【Flask】

如果需要在子模板中调用父模板,需要在block中使用{{ super() }}

请求对象

首先导入请求对象

    from flask import Flask

通过使用 method 属性可以操作当前请求方法
通过使用 form 属性处理表单数据(在 POST 或者 PUT 请求 中传输的数据)

在.py文件中添加代码如下:
@app.route('/login/',methods=['POST','GET']) # methods默认只支持GET
def login():
    # 当请求的方法为POST时
    if request.method=='POST':
        # 通过form表单获取提交的数据
        un = request.form['username']
        pw = request.form['password']
        # 判断用户名密码是否正确
        if un =='root' and pw =='redhat':
            # 正确返回登录成功
            return '登录成功'
        else:
            # 错误返回登录页面并提示
            return render_template('login.html',error='用户名或密码错误')
    # 请求方法不为POST时,返回登录页面
    return render_template('login.html')
在form 表单中利用input提交信息,并指定key值(username/password)
编写好一个简易的登录页面,如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/login/" method="post"> <--! 以post的方式提交表单-->
    <input type="text" placeholder="请输入用户名" name="username">
    <input type="password" placeholder="请输入密码" name="password">
    <input type="submit" value="登录">
    <p >{{error}}</p> <--! 登录失败时显示错误信息 -->        
</form>

</body>
</html>
登录页面

Python Web框架学习【Flask】

登录成功

Python Web框架学习【Flask】

登录失败

Python Web框架学习【Flask】

如果需要对Url中传递的参数(例如ip?key=value)进行操作
可以使用request.args.get('key')

文件上传

用 Flask 处理文件上传很容易
记得要在html页面中设置表单 enctype="multipart/form-data" 属性
否则浏览器将不会传送你的文件

在获取原文件名时可以使用filename属性,但该值可以伪造,不可信
想要把客户端上源文件名作服务器上的文件名时
可以使用Werkzeug 提供的secure_filename()函数

需要导入
                    from werkzeug.utils import secure_filename
在.py文件中添加代码如下:
from werkzeug.utils import secure_filename

@app.route('/upload/',methods=['POST','GET'])
def upload():
    # 当请求方法为POST的时
    if request.method == 'POST':
        # 读取上传的文件
        try:
            filename=None
            f = request.files['file_upload']
            # 获取文件名
            filename = secure_filename(f.filename)
            # 保存文件到doc下
            f.save('doc/%s'%filename)
        except:
            # 未获取到文件提示上传失败
            return render_template('upload.html',error='上传失败')
        # 返回上传界面,传递文件名
        return render_template('upload.html',filename=filename)
    # 返回上传界面
    return render_template('upload.html')
编写一个简易的上传html界面如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 上传文件 -->
<form action="/upload/" enctype="multipart/form-data" method="post">
    <input type="file" placeholder="未选择文件" name="file_upload">
    <input type="submit" value="提交文件">

    <!--当文件上传成功时,显示提交成功-->
    {% if filename %}
        <p >{{ filename }}提交成功</p>
    {% endif%}
    <!--未上传显示失败-->
    <p >{{ error }}</p>

</form>
</body>
</html>
上传界面

Python Web框架学习【Flask】

上传成功

Python Web框架学习【Flask】

上传失败

Python Web框架学习【Flask】


重定向和错误

使用 redirect() 函数可以重定向
使用 abort() 可以 更早退出请求,并返回错误代码
需要从flask中导入
            from flask import abort,redirect

在.py文件中添加代码如下:
@app.route('/error/')
def error():
    abort(401) # 退出并返回一个401错误页面

@app.route('/redirect/')
def direct():
    return redirect('/') # 重定向至/下(显示Helloworld)
返回错误页面

Python Web框架学习【Flask】

我们还可以使用 errorhandler() 装饰器可以定制出错页面,在.py中添加代码如下:
# 定制401出错界面为指定html 'error401.html'
@app.errorhandler(401)
def forbidden():
    return render_template('error401.html')
编写一个简易401html错误界面如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>这是一个401错误页面</h2>

</body>
</html>
新的自定义401错误页面

Python Web框架学习【Flask】


响应对象

视图函数(即被route装饰器装饰的函数)的返回值 会自动转换为一个响应对象

转换规则:

  • 如果视图返回的是一个响应对象,那么就直接返回它。
  • 如果返回的是一个字符串,那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。
  • 如果返回的是一个元组,那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目,且项目应当由 (response, status, headers) 或者 (response, headers) 组成。 status 的值会重载状态代码, headers 是一个由额外头部值组成的列表或字典。
  • 如果以上都不是,那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。
如果想要在视图函数内部获取响应对象的结果,可以使用make_response()函数

参考资料

官方中文文档

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI