Python|使用 Flask 进行 Web 开发简介
什么是烧瓶?
Flask 是Python的 API,它允许我们构建 Web 应用程序。它是由 Armin Ronacher 开发的。 Flask 的框架比 Django 的框架更明确,也更容易学习,因为它具有更少的基本代码来实现一个简单的 web 应用程序。 Web 应用程序框架或 Web 框架是模块和库的集合,可帮助开发人员编写应用程序,而无需编写协议、线程管理等低级代码。Flask 基于 WSGI(Web 服务器网关接口)工具包和 Jinja2 模板引擎。
Flask 入门:
安装 Flask 需要Python 2.6 或更高版本。您可以从任何Python IDE 上的烧瓶包中导入 Flask 开始。要在任何环境中安装,您可以单击下面给出的安装链接。
要测试安装是否正常,请查看下面给出的代码。
# an object of WSGI application
from flask import Flask
app = Flask(__name__) # Flask constructor
# A decorator used to tell the application
# which URL is associated function
@app.route('/')
def hello():
return 'HELLO'
if __name__=='__main__':
app.run()
'/' URL 与hello()
函数绑定。当在浏览器中打开 webserver 的主页时,该函数的输出将相应呈现。
Flask 应用程序通过调用run()
函数启动。对于代码中的任何更改,应手动重新启动该方法。为了克服这个问题,启用了调试支持以跟踪任何错误。
app.debug = True
app.run()
app.run(debug = True)
路由:
如今,Web 框架提供了路由技术,以便用户可以记住 URL。无需从主页导航直接访问网页很有用。它通过以下route()
装饰器完成,将 URL 绑定到函数。
# decorator to route URL
@app.route(‘/hello’)
# binding to the function of route
def hello_world():
return ‘hello world’
如果用户访问 http://localhost:5000/hello URL,则 hello_world()函数的输出将呈现在浏览器中。应用程序对象的add_url_rule()
函数也可用于将 URL 与上例中的函数绑定。
def hello_world():
return ‘hello world’
app.add_url_rule(‘/’, ‘hello’, hello_world)
在 Flask 中使用变量:
烧瓶中的变量用于通过将变量部分添加到规则参数来动态构建 URL。这个可变部分被标记为。它作为关键字参数传递。请参阅下面的示例
from flask import Flask
app = Flask(__name__)
# routing the decorator function hello_name
@app.route('/hello/')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(debug = True)
将上面的示例保存为 hello.py 并从 power shell 运行。接下来,打开浏览器并输入 URL http://localhost:5000/hello/GeeksforGeeks。
输出:
Hello GeeksforGeeks!
在上面的示例中, route() 装饰器的参数包含附加到 URL '/hello' 作为参数的变量部分。因此,如果输入像 http://localhost:5000/hello/GeeksforGeeks 这样的 URL,则“GeeksforGeeks”将作为参数传递给 hello()函数。
除了默认的字符串变量部分外,还使用了其他数据类型,如 int、float 和 path(用于可以带斜杠的目录分隔符通道)。 Flask 的 URL 规则基于 Werkzeug 的路由模块。这确保了形成的 URL 是唯一的,并且基于 Apache 制定的先例。
例子:
from flask import Flask
app = Flask(__name__)
@app.route('/blog/')
def show_blog(postID):
return 'Blog Number %d' % postID
@app.route('/rev/')
def revision(revNo):
return 'Revision Number %f' % revNo
if __name__ == '__main__':
app.run()
# say the URL is http://localhost:5000/blog/555
输出 :
Blog Number 555
# Enter this URL in the browser ? http://localhost:5000/rev/1.1
Revision Number: 1.100000
在 Flask 中构建 URL:
使用url_for()
函数动态构建特定函数的 URL。该函数接受函数名作为第一个参数,以及一个或多个关键字参数。看这个例子
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin') #decorator for route(argument) function
def hello_admin(): #binding to hello_admin call
return 'Hello Admin'
@app.route('/guest/')
def hello_guest(guest): #binding to hello_guest call
return 'Hello %s as Guest' % guest
@app.route('/user/')
def hello_user(name):
if name =='admin': #dynamic binding of URL to function
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest', guest = name))
if __name__ == '__main__':
app.run(debug = True)
为了测试这一点,保存上面的代码并通过Python shell 运行,然后打开浏览器并输入以下 URL:-
Input: http://localhost:5000/user/admin
Output: Hello Admin
Input: http://localhost:5000/user/ABC
Output: Hello ABC as Guest
上面的代码有一个名为 user(name) 的函数,通过输入 URL 接受值。它检查接收到的参数是否与“admin”参数匹配。如果匹配,则函数hello_admin(),否则调用 hello_guest()。
Flask 支持从指定 URL 检索数据的各种 HTTP 协议,这些可以定义为:-
Method | Description |
---|---|
GET | This is used to send the data in an without encryption of the form to the server. |
HEAD | provides response body to the form |
POST | Sends the form data to server. Data received by POST method is not cached by server. |
PUT | Replaces current representation of target resource with URL. |
DELETE | Deletes the target resource of a given URL |
处理静态文件:
Web 应用程序通常需要静态文件(例如 javascript 或 CSS 文件)来呈现网页在浏览器中的显示。通常,Web 服务器配置为设置它们,但在开发过程中,这些文件作为静态文件夹在您的包中或模块旁边提供。请参阅下面给出的 JavaScript 示例:
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run(debug = True)
以下 HTML 代码:
这将在模板文件夹中,该文件夹将是我们上面编写的Python文件的兄弟
hello.js
的 JavaScript 文件是:
此代码将位于静态文件夹中,该文件夹将是模板文件夹的兄弟
function sayHello() {
alert("Hello World")
}
上面的 hello.js 文件将根据 HTML 文件进行渲染。来自客户端网页的对象请求数据作为全局请求对象发送到服务器。然后通过导入 Flask 模块对其进行处理。这些属性包括 Form(包含键值对)、Args(在问号 (?) 后解析的 URL)、Cookies(包含 Cookie 名称和值)、Files(与上传文件有关的数据)和 Method(当前请求)。饼干:
Cookie 是存储在客户计算机上的一种文本文件形式,其目的是记住和跟踪与客户使用有关的数据,以便根据用户的体验和网页统计来改进网站。
Request 对象包含 cookie 的属性。它是所有 cookie 变量及其对应值的字典对象。它还包含自身的到期时间。在 Flask 中,cookie 设置在响应对象上。参见下面给出的示例:-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
index.html 的 HTML 代码
将此代码添加到上面定义的Python文件中
@app.route('/setcookie', methods = ['POST', 'GET'])
def setcookie():
if request.method == 'POST':
user = request.form['nm']
resp = make_response(render_template('cookie.html'))
resp.set_cookie('userID', user)
return resp
@app.route('/getcookie')
def getcookie():
name = request.cookies.get('userID')
return 'welcome '+name+'
'
cookie.html 的 HTML 代码
运行上述应用程序并访问浏览器上的链接 http://localhost:5000/
表单设置为“/setcookie”,函数集包含将呈现到另一个网页的 Cookie 名称 userID。 'cookie.html' 包含指向另一个视图函数getcookie() 的超链接,该函数在浏览器中显示该值。 Flask 中的会话:
在 Session 中,数据存储在 Server 上。它可以定义为客户端登录到服务器直到用户注销的时间间隔。它们之间的数据保存在服务器上的临时文件夹中。每个用户都分配有一个特定的会话 ID 。 Session 对象是一个字典,其中包含与会话关联的变量的键值对。 SECRET_KEY 用于将加密数据存储在 cookie 上。
例如:
Session[key] = value // stores the session value
Session.pop(key, None) // releases a session variable
其他重要的烧瓶功能:
redirect()
:用于返回对象的响应并将用户重定向到具有指定状态代码的另一个目标位置。
Syntax: Flask.redirect(location, statuscode, response)
//位置用于重定向到所需的URL
//statuscode发送header值,默认302
//response 用于发起响应。
abort :用于处理代码中的错误。
Syntax: Flask.abort(code)
code 参数可以采用以下值来相应地处理错误:
- 400 – 错误请求
- 401 - 对于未经身份验证
- 403 - 用于禁止请求
- 404 - 未找到
- 406 – 不可接受
- 425 – 对于不支持的媒体
- 429 – 请求过多
Flask 中的文件上传:
在 Flask 中上传文件非常简单。它需要一个带有 enctype 属性和 URL 处理程序的 HTML 表单,用于获取文件并将对象保存到所需位置。文件临时存储在服务器上,然后存储在所需位置。
处理上传 URL 的 HTML 语法是:
form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data"
Flask的以下Python代码是:
from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)
@app.route('/upload')
def upload_file():
return render_template('upload.html')
@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save(secure_filename(f.filename))
return 'file uploaded successfully'
if __name__ == '__main__':
app.run(debug = True)
将表单数据发送到服务器的 HTML 文件:
HTML 中的表单用于收集所需条目的信息,然后将其转发并存储在服务器上。这些可以被要求阅读或修改表格。烧瓶通过使用 URL 规则来提供此功能。在下面给出的示例中,'/' URL 呈现一个具有表单的网页(student.html)。填写的数据将发布到触发 result()函数的“/result” URL。 results()函数将 request.form 中存在的表单数据收集到字典对象中,并将其发送到 result.html 以进行渲染。
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def student():
return render_template('student.html')
@app.route('/result', methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html", result = result)
if __name__ == '__main__':
app.run(debug = True)
{% for key, value in result.items() %}
{{ key }}
{{ value }}
{% endfor %}
消息闪烁:
它可以定义为出现在网页上的弹出窗口或对话框,或者类似于 JavaScript 中的警报,用于通知用户。这在烧瓶中可以通过使用 Flask 中的 flash() 方法来完成。它将消息传递给下一个模板。
Syntax: flash(message, category)
消息是要显示的实际文本,类别是可选的,用于呈现任何错误或信息。
例子 :
from flask import Flask
app = Flask(__name__)
# /login display login form
@app.route('/login', methods = ['GET', 'POST'])
# login function verify username and password
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or \
request.form['password'] != 'admin':
error = 'Invalid username or password. Please try again !'
else:
# flashes on successful login
flash('You were successfully logged in')
return redirect(url_for('index'))
return render_template('login.html', error = error)
参考: Flask 文档