Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。而且有对应的python3及python2版本。
pip install virtualenv
mkdir demo
cd demo
virtualenv venv
这时你创建的myproject文件夹里面就多了一个venv文件夹
激活虚拟环境
venv\scripts\activate.bat
5.在virtualenv里面安装Flask
pip install Flask
至此flask环境已经搭好了。
通过别人的目录大致了解flask框架的目录结构
flask-demo/
├ run.py # 应用启动程序
├ config.py # 环境配置
├ requirements.txt # 列出应用程序依赖的所有Python包
├ tests/ # 测试代码包
│ ├ __init__.py
│ └ test_*.py # 测试用例
└ myapp/
├ admin/ # 蓝图目录
├ static/
│ ├ css/ # css文件目录
│ ├ img/ # 图片文件目录
│ └ js/ # js文件目录
├ templates/ # 模板文件目录
├ __init__.py
├ forms.py # 存放所有表单,如果多,将其变为一个包
├ models.py # 存放所有数据模型,如果多,将其变为一个包
└ views.py # 存放所有视图函数,如果多,将其变为一个包
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello World"
if __name__ =='__main__':
app.debug = True
app.run()
使用python运行后访问localhost:5000就能看到网页显示Hello world。
开启debug模式
app.run(debug=True)
也可以分开写:
app.debug = True
app.run()
python 1.py
flask通过route()装饰器将一个函数绑定到对应的URL上面
例如
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
@app.route('/admin')
def index():
return 'This is admin page!'
if __name__ =='__main__':
app.debug = True
app.run()
当我们访问localhost:5000/
,就能在页面上看到Hello World!
当我们访问localhost:5000/admin
,就能在页面上看到This is admin page!
flask支持在路由上制定参数及参数类型,通过
可以标记变量,这个部分将会作为命名参数传递到你的函数,也可以通过
指定一个可选的装饰器:
from flask import Flask
app = Flask(__name__)
@app.route('/admin/')
def show_user_profile(username):
return 'admin %s' % username
@app.route('/post/')
def show_post(post_id,post_name):
return 'Post_id is %d ' % post_id
if __name__ =='__main__':
app.debug = True
app.run()
这里访问localhost:5000/admin/user1
,会看到admin user1
。
访问localhost:5000/post/1
,会看到Post_id is 1
,且必须为int型,因为这里限制了参数类型。
类型转换器 | 作用 |
---|---|
缺省 | 字符型,但不能有斜杠 |
int: | 整型 |
float: | 浮点型 |
path: | 字符型,可有斜杠 |
如果需要处理具体的HTTP方法,在Flask中也很容易,使用route
装饰器的methods
参数设置即可。
# -*- coding: utf-8 -*-
from flask import Flask,request
import sys
reload(sys)
sys.setdefaultencoding("utf8")
app = Flask(__name__)
@app.route('/getone',methods=['GET'])
def show_get():
# name = request.args #{"age": "12", "name": "a"}
name = request.args['name']
age = request.args['age']
return 'Your name is %s age is %s' % (name,str(age))
@app.route('/get', methods=['GET'])
def show():
get_methods = request.args.items() #可以获取get的全部参数 存储方式: [('age', u'12'), ('name', u'a')]
return '第一个参数名字为 %s 他的值为 %s 第二个参数名字为 %s 他的值为: %s' % (get_methods[0][0],str(get_methods[0][1]),get_methods[1][0],get_methods[1][1])
@app.route('/post',methods=['POST'])
def show_post():
name = request.form['name']
age = request.form['age']
return 'Your name is %s age is %s' % (name,str(age))
if __name__== '__main__':
app.debug = True
app.run()
其中可以通过request.method
来判断请求的类型,是GET
还是POST
。
如果不写明methods
的话,post请求将不被允许
request.args.get()
方法则可以获取Get请求URL中的参数,该函数的第二个参数是默认值,当URL参数不存在时,则返回默认值
获取get和post传递的参数的方法不同。
get
用 request.args.get['name']
POST
用 request.form.get['name']
@app.route('/admin/')
def projects():
return 'The project page'
@app.route('/user')
def about():
return 'The about page'
当访问localhost:5000/admin
时,flask会自动重定向到正确的地址上。
但是访问localhost:5000/user/
时,flask会直接报404的错误。
使用route
设置路径的时候最好带上斜线
Flask提供了url_for()
方法来快速获取及构建URL方法。其第一个参数指向函数名(加过@app.route注解的函数),后续的参数为对应于要构建的URL变量。
url_for('login') # 返回/login
url_for('login', id='1') # 将id作为URL参数,返回/login?id=1
url_for('static', filename='style.css') # 静态文件地址,返回/static/style.css
和redirect一起使用可以达到页面跳转的效果
#encoding: utf-8
from flask import Flask,url_for,request,redirect
app = Flask(__name__)
@app.route('/')
def index():
login_url = url_for('login') # /login/
return redirect(login_url)
return u'这是首页'
@app.route('/login/')
def login():
return u'这是登陆页面'
@app.route('/question//')
def question(is_login):
if is_login == '1':
return u'这是发布问答的页面'
else:
return redirect(url_for('login')) # /login/
return url_for('login',id='admin')
if __name__== '__main__':
app.run(debug=True)
当我们访问localhost:5000/
时,会自动跳转到login
页面显示这是登陆页面
。
url_for('static',filename='路径')
static
文件夹开始寻找,所以不需要再写static
这个路径static
目录下url_for('static', filename='style.css')
flask的渲染方法有render_template
和render_template_string
两种。
模板的使用需要 导入render_template
和render_template_string
模块。
Flask默认使用Jinja2
作为模板,默认情况下,模板文件需要放在templates
文件夹下。
调用示例
# return render_template('demo.html')
# return render_template_string('')
render_template
的具体使用:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/hello/')
@app.route('/hello/')
def index(name=None):
return render_template("demo.html", name=name)
if __name__== '__main__':
app.run(debug=True)
demo.html
admin
{% if name %}
Hello {{ name }}!
{% else %}
Hello World!
{% endif %}
当我们访问localhost:5000/hello
,页面会输出Hello World!
当我们访问localhost:5000/hello/admin
,页面会输出Hello admin!
变量或表达式由{{ ... }}
修饰,而控制语句由{% ... %}
修饰,其他的代码,就是我们常见的HTML。
模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。
先写一下block的作用,extends是继承了整个layout.html文件里的所有的公用代码
例如这里有一个layout.html
模板,它是整个程序的布局文件。
{% block title %}{% endblock %}
{% block body %}{% endblock %}
对应的继承
show.html
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
主页
本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。
{% endblock %}
这里如果不使用block
,直接在show.html 中写html代码的话,页面是无法正常显示html代码的。所以要在layout.html
中添加一个模板,然后在子文件中使用block
来继承模板,然后再在block
中写html代码。
block
就相当于占位符的作用。
这两个页面相当于这样的一个页面:
主页
主页
本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。
当我们存在一些重复的页面功能时,我们可以使用这个方法
if条件判断可以这么写
{% ... %}中也可以写Python代码
<html>
<head>
<title>admintitle>
head>
<body>
{% if name %}
<h1>Hello {{ name }}!h1>
{% else %}
<h1>Hello World!h1>
{% endif %}
body>
html>
循环,和在Python中遍历差不多。
for.py
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/for')
def for_list():
user = ['admin','test','chuddy','aaa']
return render_template('for.html',user=user)
if __name__== '__main__':
app.run(debug = True)
for.html
<html>
<head>
<meta charset="utf-8">
<title>title>
head>
<body>
{% for i in user %}
<h4>name is : {{i}}h4>
{% endfor %}
body>
html>
default 如果变量的值为空,则取default设置的值。
demo.html
<html>
<head>
<title>admintitle>
head>
<body>
<h1>Hello {{ name|default('World') }}!h1>
body>
html>
1.py
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/hello/')
@app.route('/hello/')
def index(name=None):
return render_template("demo.html", name=name)
if __name__== '__main__':
app.run(debug = True)
字符串操作
safe:禁用转义 {{ 'hello' | safe }}
capitalize:把变量值的首字母转成大写,其余字母转小写 {{ 'hello' | capitalize }}
lower:把值转成小写 {{ 'HELLO' | lower }}
upper:把值转成大写 {{ 'hello' | upper }}
title:把值中的每个单词的首字母都转成大写 {{ 'hello' | title }}
reverse:字符串反转 {{ 'olleh' | reverse }}
format:格式化输出 {{ '%s is %d' | format('name',17) }}
striptags:渲染之前把值中所有的HTML标签都删掉 {{ 'hello' | striptags }}
truncate: 字符串截断 {{ 'hello every one' | truncate(9)}}
列表操作
first:取第一个元素 {{ [1,2,3,4,5,6] | first }}
last:取最后一个元素 {{ [1,2,3,4,5,6] | last }}
length:获取列表长度 {{ [1,2,3,4,5,6] | length }}
sum:列表求和 {{ [1,2,3,4,5,6] | sum }}
sort:列表排序 {{ [6,2,3,1,5,4] | sort }}
from flask import session
app.config['SECRET_KEY'] = os.urandom(24)
#设置session
@app.route('/sess/')
def hi():
session['name'] = 'admin'
return 'hello word'
# 读取session
@app.route('/get/')
def get():
return session.get('name')
# 删除session其中的一个
@app.route('/delete/')
def delete():
print session.get('name')
session.pop('name')
print session.get('name')
return 'successs'
# 清除session中的所用变量
@app.route('/clear/')
def clear():
print session.get('name')
session.clear()
print session.get('name')
return 'successs'
# 设置session过期时间
@app.route('/sess/')
def hi():
session['name'] = 'admin'
# 默认是flase,会话结束后session就过期。设置是True后,过期时间为30天
session.permanent = True
return 'hello word'