以下是python3配置虚拟化环境的步骤
1 配置虚拟化环境
(1)mac/linux
$ mkdir myproject
$ cd myproject
$ python3 -m venv venv
(2)windows
> mkdir myproject
> cd myproject
> py -3 -m venv venv
2 激活虚拟化环境
(1)mac/Linux
$ . venv/bin/activate
(2)window
> venv\Scripts\activate
进入虚拟化环境的标志
退出虚拟化环境
mac/Linux
$ deactivate
3 安装flask
pip3 install flask
4 配置虚拟化环境的好处
虚拟环境可以为每一个项目安装独立的 Python 库,这样就可以隔离不同项目之 间的 Python 库,也可以隔离项目与操作系统之间的 Python 库。
保存到hello.py 中
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.debug = True
app.run()
在项目中导入Flask模块是强制性的。 Flask类的一个对象是WSGI应用程序。
Flask构造函数将当前模块的名称(name)作为参数。
Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。
app.route(rule, options)
rule 参数表示与该函数绑定的URL。
options 是要转发给底层Rule对象的参数列表。
在上面的例子中,’/’ URL与hello_world()方法绑定。 因此,在浏览器中打开Web服务器的主页时,将呈现此函数的输出。
Flask类的run()方法在本地开发服务器上运行应用程序。
启动程序 python3 hello.py
调试模式
Flask应用程序通过调用run()方法来启动。 但是,当应用程序正在开发中时,应该为代码中的每个更改手动重新启动它。 为了避免这种不便,可以启用调试支持。 如果代码改变,服务器将自动重新加载。 它还将提供一个有用的调试器来跟踪应用程序中的错误(如果有的话)。
在运行或将调试参数传递给run()方法之前,通过将应用程序对象的调试属性设置为True来启用调试模式。
app.debug = True 热加载
app.run()
app.run(debug = True) 热加载
现代Web框架使用路由技术来帮助用户记住应用程序URL。 无需从主页导航即可直接访问所需页面。
Flask中的route()装饰器用于将URL绑定到函数。 例如 -
@app.route('/hello')
def hello_world():
return 'hello world'
这里,URL /hello规则绑定到hello_world()函数。 因此,如果用户访问URL : http://localhost:5000/hello ,就会调用hello_world()函数,这个函数中的执行的结果输出将在浏览器中呈现。
应用程序对象的add_url_rule()函数也可用于将URL与函数绑定,如上例所示,使用route()。
def hello_world():
return 'hello world'
app.add_url_rule('/', 'hello', hello_world)
这个变量部分被标记为。 它作为关键字参数传递给规则所关联的函数。
variable 可以省略
实例 :variable 可以省略
from flask import Flask
app = Flask(__name__)
@app.route('/hello/' )
def hello_name(name):
return 'hello %s!' % name
if __name__ == '__main__':
app.run(debug=True,port=8090)
from flask import Flask
app = Flask(__name__)
@app.route('/hello/' )
def hello_name(score):
return '您的成绩: %s!' % score
if __name__ == '__main__':
app.run(debug=True,port=8090)
from flask import Flask
app = Flask(__name__)
@app.route('/flask')
def hello_flask():
return 'Hello Flask'
@app.route('/python/')
def hello_python():
return 'Hello Python'
if __name__ == '__main__':
app.run()
两条规则看起来都很相似,但在第二条规则中,使用了尾部斜线(/)。 因此,它变成了一个规范的URL。 因此,使用/python或/python/返回相同的输出。 但是,在第一条规则的情况下, URL:/flask/会导致404 Not Found页面。
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 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,port=8090)
上面的脚本有一个函数用户(名称),它接受来自URL的参数值。
User()函数检查收到的参数是否与’admin’匹配。 如果匹配,则使用url_for()将应用程序重定向到hello_admin()函数,否则将该接收的参数作为guest参数传递给hello_guest()函数。
redirect :重定向的关键字
url_for :指定返回的函数
默认情况下,Flask路由响应GET请求。 但是,可以通过为route()装饰器提供方法参数来更改此首选项。
下面演示post请求
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/' )
def success(name):
return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['name']
return redirect(url_for('success',name = user))
else:
user = request.args.get('name')
return redirect(url_for('success',name = user))
if __name__ == '__main__':
app.run(debug=True,port=8090)
可以利用Jinja2模板引擎技术,而不需要从函数返回硬编码HTML。如下代码所示,可以通过render_template()函数渲染HTML文件。
flask将尝试在该脚本所在的同一文件夹中查找templates文件夹中的HTML文件。
实例
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)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask HTTP请求方法处理title>
head>
<body>
<h1>Hello {{ name }}!h1>
body>
html>
Jinja2模板引擎使用以下分隔符来从HTML转义。
{% … %} 用于多行语句
{{ … }} 用于将表达式打印输出到模板
{# … #} 用于未包含在模板输出中的注释
【 # … ## 用于单行语句 】
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例title>
head>
<body>
{% if marks>50 %}
<h1> 通过考试!h1>
{% else %}
<h1>未通过考试!h1>
{% endif %}
body>
html>
请注意,条件语句if-else和endif包含在分隔符{%…。%}中。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例title>
head>
<body>
<table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} th>
<td> {{ value }} td>
tr>
{% endfor %}
table>
body>
html>
在这里,与For循环相对应的Python语句包含在{%…%}中,而表达式键和值放在{{}}中
在工作目录创建一个static 文件夹 ,在static下存放静态文件,.js .css 文件等
实例:
<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>
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,port=8090)
hello.js 文件
function sayHello() {
alert("Hello World")
}
我们已经看到,可以在URL规则中指定http方法。URL映射的函数接收到的表单数据可以以字典对象的形式收集,并将其转发给模板以在相应的网页上呈现它。
在以下示例中,URL => / 呈现具有表单的网页(student.html)。填充的数据会提交到触发result()函数的URL => /result 中。
results()函数收集字典对象中request.form中存在的表单数据,并将其发送给result.html 并显示出来。
该模板动态呈现表单数据的HTML表格。
下面给出的是Python的应用程序代码 -
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/result',methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return result
if __name__ == '__main__':
app.run(debug=True,port=8090)
result 返回到前端是 json 对象
form.to_dict() 接收数据并转换成python的 dict
form.get(key) 通过key 找 value