目录
1、安装,略
2、测试flask安装
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
如果在服务器上要外部访问需要改最后一行:
app.run('0.0.0.0')
端口默认5000,
Flask构造函数使用当前模块(__name__)的名称作为参数。
Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。
app.route(rule, options)
rule参数表示与该函数的URL绑定。
Flask类的run()方法在本地开发服务器上运行应用程序。
app.run ( host, port, debug, options )
参数描述:
host:要监听的主机名。默认127.0.0.1(localhost)
port:默认值5000
debug:默认为false。如果设置为true,则提供调试信息。
options:要转发到底层的Werkzeug服务器。
3、Flask路由
route()装饰器用于将URL绑定到函数。
application对象的add_url_rule()函数也可以绑定。
def hello_world():
return 'hello world'
app.add_url_rule('/','hello',hello_world)
4、Flask变量规则
通过向规则参数添加变量部分,可以动态构建URL。此变量部分标记为<variable-name>。它作为关键字参数传递给与规则相关联的函数。
from flask import Flask
app = Flask(__name__)
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(debug = True)
5、Flask URL构建
url_for函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。
from flask import Flask, redirect, url_for
app = Flask(name)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest = name))
if name == 'main':
app.run(debug = True)
上述脚本有一个函数user(name),它接受来自URL的参数的值。
User()函数检查接收的参数是否与'admin'匹配。如果匹配,则使用url_for()将应用程序重定向到hello_admin()函数,否则重定向到将接收的参数作为guest参数传递给它的hello_guest()函数。
保存上面的代码并从Python shell运行。
打开浏览器并输入URL - http://localhost:5000/user/admin
浏览器中的应用程序响应是:
Hello Admin
在浏览器中输入以下URL - http://localhost:5000/user/mvl
应用程序响应现在更改为:
Hello mvl as Guest
5、Flask HTTP方法
默认情况下,Flask路由响应GET请求。
将以下脚本另存为login.html
<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
在python shell中输入以下脚本:
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
user = request.args.get('nm')
return redirect(url_for('success',name = user))
if __name__ == '__main__':
app.run(debug = True)
6、Flask模板
可以以HTML的形式返回绑定到某个URL的函数的输出。例如,在以下脚本中,hello()函数将使用标签呈现'Hello World'。
from flask import Flask
app = Flask(name)
@app.route('/')
def index():
return '
'Hello World'
'
if name == 'main':
app.run(debug = True)
但是,从Python代码生成HTML内容很麻烦,尤其是在需要放置变量数据和Python语言元素(如条件或循环)时。这需要经常从HTML中转义。
这是可以利用Flask所基于的Jinja2模板引擎的地方。而不是从函数返回硬编码HTML,可以通过render_template()函数呈现HTML文件。
from flask import Flask,render_template
app = Flask(name)
@app.route('/')
def index():
return render_template(‘hello.html’)
if name == 'main':
app.run(debug = True)
Flask将尝试在templates文件夹中找到HTML文件,该文件存在于此脚本所在的文件夹中。
- Application folder
- Hello.py
- templates
- hello.html
术语‘web templating system(web模板系统)’指的是设计一个HTML脚本,其中可以动态插入变量数据。web模板系统包括模板引擎,某种数据源和模板处理器。
Flask使用jinga2模板引擎。Web模板包含用于变量和表达式(在这些情况下为Python表达式)的HTML语法散布占位符,这些是在呈现模板时替换的值。
以下代码在templates文件夹中另存为hello.html 。
<!doctype html>
<h1>Hello {{ name }}!</h1>
接下来,从python shell运行以下脚本:
from flask import Flask, render_template
app = Flask(name)
@app.route('/hello/')
def hello_name(user):
return render_template('hello.html', name = user)
if name == 'main':
app.run(debug = True)
当开发服务器开始运行时,打开浏览器并输入URL - http://localhost:5000/hello/mvl
URL的变量部分插入{{name}}占位符。
Jinja2模板引擎使用以下分隔符从HTML转义。
- {% ... %}用于语句
- {{ ... }}用于表达式可以打印到模板输出
- {# ... #}用于未包含在模板输出中的注释
- # ... ##用于行语句
在模板中使用条件语句。hello()函数的URL规则接受证书参数。它被传递到hello.html模板。其中,比较接受的数字(marks)的值(大于或小于50),因此有条件呈现HTML
from flask import Flask, render_template
app = Flask(name)
@app.route('/hello/')
def hello_name(score):
return render_template('hello.html', marks = score)
if name == 'main':
app.run(debug = True)
hello.html的HTML模板脚本如下:
<!doctype html>
{% if marks>50 %}
<h1> Your result is pass!</h1>
{% else %}
<h1>Your result is fail</h1>
{% endif %}
请注意,条件语句if-else和endif包含在分隔符{%…%}中。
7、Flask静态文件
Web应用程序通常需要静态文件,
例如javascript文件或支持网页显示的CSS文件。通常,配置Web服务器并为您提供这些服务,但在开发过程中,这些文件是从您的包或模块旁边的static文件夹中提供,它将在应用程序的/static中提供。
特殊端点'static'用于生成静态文件的URL。
在下面的示例中,在index.html中的HTML按钮的OnClick事件上调用hello.js中定义的javascript函数,该函数在Flask应用程序的“/”URL上呈现。
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)
index.html
<html>
<head>
<script type = "text/javascript"
src = "{{ url_for('static', filename = 'hello.js') }}" ></script>
</head>
<body>
<input type = "button" onclick = "sayHello()" value = "Say Hello" />
</body>
</html>
Hello.js包含sayHello()函数。
function sayHello() {
alert("Hello World")
}
Flask Request对象
来自客户端网页的数据作为全局请求对象发送到服务器。为了请求数据,应该从Flask模块导入。
Request对象的重要属性如下所列:
-
Form - 它是一个字典对象,包含表单参数及其值的键和值对。
-
args - 解析查询字符串的内容,它是问号(?)之后的URL的一部分。
-
Cookies - 保存Cookie名称和值的字典对象。
-
files - 与上传文件有关的数据。
-
method - 当前请求方法
(中间隔了一部分)
8、Flask文件上传
在Flask中处理文件上传非常简单。它需要一个HTML表单,其enctype属性设置为“multipart / form-data”,将文件发布到URL。URL处理程序从request.files[]对象中提取文件,并将其保存到所需的位置。
每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。目标文件的名称可以是硬编码的,也可以从request.files[file]对象的filename属性中获取。但是,建议使用secure_filename()函数获取它的安全版本。
可以在Flask对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
以下代码具有'/ upload' URL规则,该规则在templates文件夹中显示'upload.html',以及'/ upload-file' URL规则,用于调用uploader()函数处理上传过程。
'upload.html'有一个文件选择器按钮和一个提交按钮。
<html>
<body>
<form action = "http://localhost:5000/uploader" method = "POST"
enctype = "multipart/form-data">
<input type = "file" name = "file" />
<input type = "submit"/>
</form>
</body>
</html>
您将看到如下所示的界面。
选择文件后,单击提交。表单的post方法调用'/ upload_file' URL。底层函数uploader()执行保存操作。
以下是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)
整理自w3school:https://www.w3cschool.cn/flask/flask_sqlite.html