pip install flask
from flask import Flask
app = Flask(__name__)
__name__是模块的名称或者包的名称
作用: 根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径;也可以说这里的app就是一个程序实例,客户端(一般是浏览器)将请求发送给服务端Web服务器,Web服务器再把请求发给Flask实例。
模块就是python文件; 包就是目录(跟普通目录多加一个__init__.py);
程序实例需要知道所有url对应的执行代码,所以要有从url到python函数的映射关系。处理url到python函数映射关系的程序一般叫做路由(Router)。
@app.route('/')
def index():
return 'hello world
'
@app.route('/login/')
def login():
return 'login'
@app.route(’/’): 告诉Flask哪个url才能出发对应的函数,又称为路由;对应定义了一个视图函数,也就是返回给用户浏览器显示的内容; 即路由所对应的程序称为视图函数(view function),即上面的index()函数
app.run()运行应用,启动服务器,可以指定ip和端口
‘0.0.0.0’ 所有的IP都可以访问到
app.run('0.0.0.0', 9000)
1. url的一部分可以标记为变量<变量名>
2. flask中路由里面的变量常见类型:
int, string, float, path, uuid
from flask import Flask
app=Flask(__name__)
@app.route('//comments/')
def index(id):
return 'index id: %s' %(id)
@app.route('/welcome//')
def welcome(user):
app.logger.debug('this is a debug')
app.logger.warning('this is a warn')
return user+'用户,欢迎来到XX商场'
app.run()
from flask import Flask, request, url_for
app=Flask(__name__)
@app.route('/welcome/')
def welcome(user):
return user +'用户,欢迎光临'
@app.route('/path/')
def path():
print(request.headers)
#查看默认url地址的请求方法
print(request.method)
#url_for:根据函数名,反向生成url地址
print('用户正在访问url地址:%s' %(url_for(endpoint='welcome',user='Merry')))
return '用户正在访问url地址:%s' %(url_for(endpoint='welcome',user='Merry'))
app.run()
通过 request类,可以得到其头部信息或者访问模式,是 get 或者 post 等
POST:
GET:
如何指定接收多个HTTP请求方法? [email protected](’/login/’, methods=[‘GET’, ‘POST’])
路由: @app.route('/login/', methods=['GET', 'POST'])
视图函数: def login():
request.method
request.form['user']
python中生成html不易修改与维护, 所以将html的内容独立到templates目录中。
python的Web开发中,业务逻辑(实质就是视图函数的内容)和表现逻辑(html文件)分开的, 使得代码的可读性增强,代码容易理解和维护,表现逻辑往往放在模板中。
render_template('login.html')
return render_template('login.html', message="用户名或者密码错误")
当访问页面错误时,通过@app.errorhandler(404)自定义404错误
再通过重定向访问404专属页面
具体如下:
from flask import Flask, render_template, \
request, redirect, url_for,abort
app=Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method=='POST':
print(request.form)
#1.如何获得用户提交的信息呢?
user=request.form['user']
passwd=request.form['passwd']
#2.判断用户名和密码是否正确
if user=='root' and passwd=='redhat':
#如果登陆成功,跳转到主页
return redirect(url_for('index'))
else:
#如果登陆失败,重新登陆
return render_template('login.html',message='用户名或密码错误')
else:
#用户是GET请求, 返回登陆的html页面
#1.读取login.html文件的内容
#2.将读取的内容返回给用户界面
return render_template('login.html')
#404异常处理
@app.errorhandler(404)
def not_find(e):
return render_template('404.html')
#抛出异常
@app.route('/user//')
def user(user_id):
if 0
模板渲染: 在html文件中,通过动态赋值 ,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
其他的模板引擎: Mako, Template, Jinja2
#for循环:
{% for i in li%}
{% endfor %}
# if语句
{% if user == 'westos'%}
{% elif user == 'hello' %}
{% else %}
{% endif%}
示例:
from flask import Flask,render_template
app=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return '' %(self.name)
@app.route('/')
def index1():
name='这是一个消息'
li=[1,2,3,4]
d=dict(a=1,b=3)
u=User('Merry','passwd')
return render_template('index1.html',li=li,
name=name,d=d,u=u)
app.run()
index1.html:
Title
变量:{{name}}
列表:{{li}}
{% for i in li %}
列表元素显示:{{i}}
{% endfor %}
字典:{{d}}
字典元素显示:{{d.a}}
字典元素显示:{{d['b']}}
对象:{{u}}
用户名
密码
{{u.name}}
{{u.passwd}}
import time
import os
print(time.time())
print(time.ctime())
print(time.localtime())
print(time.localtime().tm_hour)
#时间戳--->字符串
mtime = os.path.getmtime('/etc/passwd')
print(time.ctime(mtime))
ttime = time.localtime(mtime)
#元组--->指定字符串
print(time.strftime("%Y-%m-%d %H:%M:%S", ttime))
import time
from flask import Flask, render_template
app=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return '' %(self.name)
@app.route('/')
def hello():
name=' This is a news'
li=[1,2,3,4]
d=dict(a=1,b=3)
liDict=[
{'count':100,'price':30},
{'count':90,'price':20},
]
u=User('Merry','passwd')
return render_template('hello.html',
name=name,
li=li,
d=d,
u=u,
liDict=liDict,
)
app.run()
hello.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
app=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return '' %(self.name)
@app.route('/')
def index2():
name=' This is a news'
li=[1,2,3,4]
d=dict(a=1,b=3)
liDict=[
{'count':100,'price':30},
{'count':90,'price':20},
]
u=User('Merry','passwd')
timestamp=time.time()
return render_template('index2.html',
name=name,
li=li,
d=d,
u=u,
liDict=liDict,
timestamp=timestamp
)
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)
app.add_template_filter(format_date, 'format_date')
app.run()
index2.html:
Title
过滤器实质上就是一个转换函数/方法
{{ timestamp }}
{{ timestamp | format_date }}
/*常见的字符串过滤器操作:*/
- {{ name | upper }}
- {{ name | lower }}
- {{ "hello" | capitalize }}
- {{ " hello world" | capitalize }}
- {{ name | reverse }}
/*常见数值操作*/
四舍五入
- {{ -12.9623423435 | round }}
- {{ -12.9623423435 | round | abs }}
/*列表常见:*/
- {{ li }}
- {{ li | first }}
- {{ li | last }}
- {{ li | length }}
- {{ li | sum }}
- {{ li | sort | reverse }}
- {{ li | join(":") }}
- {{ ["hello", "world"] | upper}}
- {{ ["hello", "woHld"] | lower}}
/*列表包含字典常用操作:*/
{% for item in liDict | sort(attribute='price', reverse=false) %}
{{ item }}
{% endfor %}