一 什么是Flask
二 Flask框架的基本结构
from flask import Flask
app = Flask(__name__)
其中:__name__是模块的名称或者包的名称
作用:根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径
模块就是python文件; 包就是目录(跟普通目录多加一个__init __. py)
@app.route('/')
def index():
return "hello world
"
其中: @app.route(’/’): 告诉Flask哪个URL才能出发对应的函数, 又称为路由
对应定义了一个视图函数, 也就是返回给用户浏览器显示的内容
app.run()
当然也可以指定IP和端口
让指定的IP号访问:
app.run('172.25.254.69',9000)
也可以让本机所有的IP号访问:
app.run('0.0.0.0',9000)
from flask import Flask
fla=Flask(__name__)
@fla.route('/')
def index():
return 'hello'
fla.run()
三 路由与变量规则
常见路由规则:
1). url的一部分可以标记为变量<变量名>
2). flask中路由里面的变量常见类型:int,string,float,path,uuid
from flask import Flask
fla=Flask(__name__)
@fla.route('//comments/')
def index(id):
return '%s index' %(id)
@fla.route('/welcome//')
def welcome(user):
return 'welcome %s' %(user)
fla.run()
四 URL构建与反向URL
from flask import Flask, request, url_for
app = Flask(__name__)
@app.route('/welcome//')
def welcome(user):
return user + "用户, 欢迎来到westos"
@app.route('/path/')
def path():
print(request.headers)
print(request.method)
# url_for: 根据函数名, 反向生成url地址
print("用户正在访问url地址:%s" % (url_for(endpoint="welcome", user="westos")))
return "用户正在访问url地址:%s" % (url_for(endpoint="welcome", user="westos"))
app.run()
执行结果:
构建新的URL,访问该URL获得信息
注意:
1).通过 url_for ,根据函数名,反向构建URL
2).通过 request类,可以得到其头部信息或者访问模式,是 get 或者 post ,等
五 Flask框架的一些问题
前面写过一个简单的HTML页面:
包括(主页,登陆页和注册页)
现在通过Flask框架对其进行编辑,让代码更加的简短,让客户端提交的数据到达后台,进行数据处理
简单的判断:
1).用户登陆时的用户名与密码(看其用户名是否是root,密码是否是westos)
2).html页面的异常处理(弹出404报错页面)
from flask import Flask, request, render_template, redirect, url_for, abort
fla=Flask(__name__)
@fla.route('/')
def index():
return render_template('index.html')
@fla.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'POST':
user=request.form['user']
passwd=request.form['passwd']
if user == 'root' and passwd == 'westos':
return redirect(url_for('index'))
else:
return render_template('login.html',message='用户名或者密码错误')
else:
return render_template('login.html')
@fla.errorhandler(404)
def not_found(e):
return render_template('404.html')
@fla.route('/user/')
def user(user_id):
if 0
需要注意的点:
__ get __
@app.route('/login/', methods=['GET', 'POST'])
request.method()
如何获取用户POST请求提交的表单数据?
request.form()
模版渲染
Flask自带的模版引擎:jinjia2
在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程
python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护
python中生成html不易修改与维护, 所以将html的内容独立到templates目录中
1).去当前项目目录下寻找templtes是否存在?再去判断templates目录下是否有login.html文件?
2). 读取这个login.html文件的内容, 作为render_template的返回值;
3). 最终返回给用户浏览器:render_template('login.html')
重定向和错误提示
1).运用redirect
重新定向 html页面
运用render_template
重新渲染html页面
2).错误提示:
render_template('login.html', message="用户名或者密码错误")
运用 jinjia2 通过后台向前台提示信息,信息内容为 message="用户名或者密码错误"
@app.errorhandler(404)
自定义404错误六 变量的显示
通过 jinjia2 的变量规则来显示一些变量
包含(字符串、列表、字典和类)
from flask import Flask,render_template
fla=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return 'User : %s' %(self.name)
@fla.route('/')
def muban():
name='hello world'
li=[1,2,3,4]
d=dict(a=1,b=2)
u=User('westos','passwd')
return render_template('hello.html',
name=name,
li=li,
d=d,
u=u
)
fla.run()
hello.html 页面内容:
Title
变量:{{name}}
列表:{{li}}
{% for i in li %}
列表元素显示:{{i}}
{% endfor %}
字典:{{d}}
字典元素显示:{{d.a}}
字典元素显示:{{d['b']}}
对象:{{u}}
用户名
密码
{{u.name}}
{{u.passwd}}
七 过滤器与自定义过滤器
from flask import Flask,render_template
fla=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return 'User : %s' %(self.name)
@fla.route('/')
def filtration():
name='hello world'
li=[1,2,3,4]
d=dict(a=1,b=2)
dDict=[
{'count':100,'price':20},
{'count':50,'price':30}
]
u=User('westos','passwd')
return render_template('filtration.html',
name=name,
li=li,
d=d,
u=u,
dDict=dDict,
)
fla.run()
filtratio.html 页面:
Title
字符串
- {{name | upper}}
- {{name | lower}}
- {{'hello' | capitalize}}
- {{name | reverse}}
数值
- {{li}}
- {{li | first}}
- {{li | last}}
- {{li | length}}
- {{li | sum}}
- {{li | sort}}
- {{li | reverse}}
- {{li | join(':')}}
import time
from flask import Flask,render_template
fla=Flask(__name__)
# @fla.add_template_filter
def format_date(value,format='%Y-%m-%d %H:%M:%S'):
ttime=time.localtime(value)
return time.strftime('%Y-%m-%d %H:%M:%S',ttime)
fla.add_template_filter(format_date,'format_date') #两个方法都可以
@fla.route('/')
def filtration():
now_time=time.time()
return render_template('filtration.html',
now_time=now_time
)
fla.run()
filtration.html 页面:
Title
{{now_time}}
{{now_time | format_date}}
八 模版的继承
{% extends "模板名称" %}
{% block 名称 %}
默认值
{% endblock %}
填坑:
{% block 名称 %}
代码内容
{% endblock %}
{% block 名称 %}
默认值
{% endblock %}
挖坑:
{% block 名称 %}
#如何继承挖坑时的默认值?
{{ super() }}
# 后面写新加的方法.
........
{% endblock %}
九 宏macro的使用
定义marco.html
{% macro 函数名(变量)%}
html代码样(包含需要替换的变量)
{% endmacro %}
可以改写包含此宏的html
十 Flask的初步应用
修改上面的页面,分为(主函数:py文件、static:静态目录(放置css样式,js和字体样式等)、templates(放置html文件))
tempaltes目录下的html文件:
{% block title %} {% endblock %}西部开源
{% block connent %}
{% endblock %}
{% macro input(text,name,type) %}
{% endmacro %}
Title
404:页面找不到
{% extends 'base.html' %}
{% block title %}
首业
{% endblock %}
{% block connent %}
{% endblock %}
{% extends 'base.html' %}
{% block title %}
登陆
{% endblock %}
{% block connent %}
登录
没有账号?注册
{% endblock %}
主函数:run.py
from flask import Flask, request, render_template, redirect, url_for, abort
fla=Flask(__name__)
@fla.route('/')
def index():
return render_template('index.html')
@fla.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'POST':
user=request.form['user']
passwd=request.form['passwd']
if user == 'root' and passwd == 'westos':
return redirect(url_for('index'))
else:
return render_template('login.html',message='用户名或者密码错误')
else:
return render_template('login.html')
@fla.route('/signup/',methods=['GET','POST'])
def signup():
if request.method == 'POST':
tel=request.form['tel']
yanzheng=request.form['yanzheng']
mima=request.form['mima']
if tel == '123' and yanzheng == '456' and mima == '789':
return '注册成功'
else:
return '注册失败'
else:
return render_template('signup.html')
@fla.errorhandler(404)
def not_found(e):
return render_template('404.html')
@fla.route('/user/')
def user(user_id):
if 0