flask的基本配置
-
pip install flask
-
flask是一个轻量级python框架
-
import flask
-
from flask import Flask
网站入口点
- 网站使用主函数作为入口
if __name__=="__main__":
app.run( )
# app为定义的flask应用
main( )
创建第一个flask程序
# 创建一个flask程序
app = Flask(__name__)
路由
- 路由 = 什么路径可以访问到什么资源
- python中的路由是使用装饰器进行执行的
- 新建一个路由
# 装饰器,把下面的函数给上面的路由执行
@app.route('/')
def a_page():
return "Hello World"
pass
- 或者是另一种方法
debug模式
- flask支持修改端口,访问的ip以及调试模式
if __name__=="__main__": app.run(host="0.0.0.0",port=8888,debug=True)
main()
静态资源加载
- 新建static和templates文件夹
- 设置静态文件的路径
app = Flask(__name__,
static_url_path='/static',
# 当解析到这个地址的时候,不要通过路由的方法解析,而是访问static文件内容
static_folder='static', template_folder='templates'
)
参数的传入
单个参数
#单参数传入
@app.route('/get/<user_input>')
def user_input(user_input):
return user_input
pass
多个参数
#多参数传入
@app.route('/login/<username>/<passwd>')
def multiy(username, passwd):
return "Login User:%s"%username+' ' \
''+"Login Passwd:%s"%passwd
pass
指定传入的参数的类型
乱传入会导致404
#多参数传入
@app.route('/login/<str: username>/<int: passwd>')
def multiy(username, passwd):
return "Login User:%s"%username+' ' \
''+"Login Passwd:%s"%passwd
pass
指定传参的方法
GET方法
from flask import request
@app.route('/login',methods=['GET'])
# 指定GET方法提交,否则返回405
def multiy():
username = request.args.get("username")
#username为一个参数,此时args只能用于get方法
passwd = request.args.get("passwd")
#passwd为一个参数
return "Login User:%s and Login Password:%s"%(username,passwd)
pass
# 访问http://10.0.131.180:8888/login?username=123&passwd=456
POST方法
from flask import request
@app.route('/login',methods=['POST'])
# 指定POST方法提交,否则返回405
def multiy():
username = request.form.get("username")
#username为一个参数,此时form只能用于post方法
passwd = request.form.get("passwd")
#passwd为一个参数
return "Login User:%s and Login Password:%s"%(username,passwd)
pass
# 访问http://10.0.131.180:8888/login传入两个参数
获取请求类型
request.headers
获取请求头request.method
获取请求类型request.headers.get("User-Agent")
获取请求UA信息request.path
获取请求的路径
.fullpath(完整路径)
.baseurl
.url
.user_agent.platform
新建特殊的路由
#不通过装饰器传入
def route1():
return "Hello Python!"
pass
if __name__=="__main__":
app.add_url_rule('/hellopy', route1) app.run(host="0.0.0.0",port=8888,debug=True)
接口
- json数据:{“name”:“xiaoming”,“age”:“21”}
- 可以使用json包,也可以from flask import json
- 字典转化为json
# 定义一个字典
@app.route('/jiekou')
def jiekou():
json_dic = {
"name":"xiaoli",
"age":"89",
"score":"100"
}
#字典转化为json
result = json.dumps(json_dic)
return result
pass
重定向
@app.route('/b')
def b_page(user_id):
return "你来了啊"
@app.route('/redirect')def redirect():
# 跳转到站外
return flask.redirect('http://www.cctv.com')
# 跳转到站内
return flask.redirect(flask.url_for('/b'))
404重定向
# 404重定向
@app.errorhandler(404)
def page_not_found(e):
return "你出错了",404
url别名
- 当我们访问的路由很长的时候,我们可以给路由取一个别名
@app.route('/a/b/c/d/e/f/g/h',endpoint='ab')
def ab_page():
return "你到了"
@app.route('/j')
def tiaozhuan():
return flask.redirect(flask.url_for('ab'))
# 访问/j会返回到上面的路由
异常捕获
- 把网站的状态码全部反馈为404,可以防止黑客进行扫描
@app.route('/a')
def a_page():
return "Hello World", 404
pass
# 此时访问路由a,会受到404状态码,但是页面能正常显示
- 主动抛出404状态码
@app.route('/a')
def a_page():
flask.abort(404)
return 'a'
# 主动抛出404异常
pass
支持html返回
- 使用python解析html的编码
# 返回html语句
@app.route('/about')
def about():
return Response('<h1>This is title</h1>'
'<p>This is paragraph</p>')
模板入门
- 在templates里面新建一个模板的html文件(tempa.html)
- 添加路由
# 返回和html模板
@app.route('/mb')
def muban():
return flask.render_template("tempa.html")
- 模板的继承
子模板继承父模板 - 在父模板中圈定可以添加东西的区域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>A路由测试</title>
</head><body>
<h1>这是父模板</h1>
<!--规定子模版从这里可以开始加东西-->
{% block contentBlock %}
<h1>This is parent temp</h1>
{% endblock %}
<!--这里结束添加-->
</body>
</html>
- 子模版继承父模板的内容,并且添加自己的东西
{% extends 'tempa.html' %}
<!--这里表示继承父模板-->
{% block contentBlock %}
<!--这里字模板开始添加东西-->
{{super()}}
<!--super表示继承父模板的所有东西-->
<h2>这是字模板</h2>
<h3>HAHAHAHA</h3>
{% endblock %}
<!--结束继承-->
模板传参
-
{{x}}存放变量
-
{%…%}控制代码块
-
{#…#}注释符
-
后端代码
# 模板传参
@app.route('/test1/<username>')
def test1(username):
user_name = username
return flask.render_template('test1.html',uname=user_name)
pass
- 前端代码
<body>
<h1>Welcome,{{uname}}</h1>
</body>
过滤器
- 新建一个过滤器,(例如叫做dore过滤器)
# 过滤器
@app.template_filter('dore')
# 新建一个过滤器
def do_reverse(li):
temp = list(li)
temp.reverse()
return temp
# 此过滤器会把传入的列表进行翻转
- 在模板中加入对过滤器的引用
<body>
<h1>
Welcome,{{listname | dore}}
</h1>
</body>
- 路由给模板传入参数
@app.route('/filter')
def filter():
li = ['U', 'Love', 'I']
return flask.render_template('test1.html',listname=li)
# 此时访问filter后,值在输出之前会首先经过过滤器进行过滤
控制代码块
- for循环遍历列表中的值
{% for item in mlist %}
- {{item}}
{% endfor %}- if判断语句
{% if vip==0 %}
你没有充值
{% elif vip ==1 %}lv1的内容
{% endif %}cookie交互
- 设置cookie
# k路由设置cookie @app.route('/k') def k_page(): response = flask.make_response('success') response.set_cookie('user_id', '10', max_age=50) response.set_cookie('vip', '0', max_age=50) return response
- 读取cookie
# n路由读取cookie @app.route('/n') def n_page(): user_id = request.cookies.get('user_id') vip = request.cookies.get('vip') return flask.render_template('cookie.html', user_id=user_id, vip=vip) pass
<body> {% if vip == '0' %} {{'你不是vip'}} {% elif vip == '1' %} {{'您好'}} {% endif %} </body>
- 退出登录删除cookie
# 删除cookie @app.route('/logout') def logout(): response = flask.make_response('退出登录成功') response.delete_cookie('user_id') response.delete_cookie('vip') return response pass
session 交互
- session 比cookie更安全,因为它是存储在服务器的,而且加密
- 设置加密字符串
from datetime import timedelta # 配置加密字符串 app.config['SECRET_KEY'] = "key123" # 设置七天有效 app.config["PERMANENT_SESSION_LIFELINE"] = timedelta(days=7)
- 赋予session
@app.route('/sess') def session_test(): response = flask.make_response('success') session['user_id'] = '20' session['vip'] = '0' return response
- 读取session
# 读取session @app.route('/rs') def read_session(): response = flask.make_response('success') user_id = flask.session['user_id'] vip = flask.session['vip'] return flask.render_template('session.html',user_id=user_id,vip=vip)
- 删除session
# 删除session @app.route('/seout') def session_out(): flask.session.pop("user_id") flask.session.pop("vip") # session['user_id']=False # sesson.clear() return "success"
表单处理
- 前端代码
<form method="post" action="/chuli"> 用户名:<input type="text" name="uname"/><br/> 密码:<input type="password" name="passwd"/><br/> <input type="submit" name="submit" value="提交"> </form>
- 后端代码
@app.route('/form') def form(): return render_template('form.html') pass @app.route('/chuli', methods=['POST']) def chuli(): if request.method=='POST': username = request.form.get("uname") password = request.form.get("passwd") print("用户名提交了"+username+"密码提交了"+password) return render_template('chuli.html') pass
数据库入门
# 数据库入门 # 打开数据库 db = pymysql.connect(host="localhost", user="root", password="root",db="haha") # 创建目标对象 cursor = db.cursor() #sql语句 sql = "select * from users" # 执行sql语句 cursor.execute(sql) # 确认执行 db.commit() list1 = [] for i in range(5): data = cursor.fetchone() # 取出来的是元组,可以转换为列表 li = list(data) list1.append(li) for item in list1: print(item)
- 数据库的改善操作
# 拿出所有 for item in cursor.fetchall(): print(item)
- 其他数据库执行语句
sql = """ INSERT INTO users(username,password)values('test3', '999') """ try: #执行sql cursor.execute(sql) #确认 db.commit() except: #执行失败就回退 db.rollback()
补充
- flask返回其他类型的数据
@app.route("/") def otherback(): filename = getpaper.done() # 定义返回类型是一张图片,通过MIME确认 resp1 = Response(filename, mimetype="image/jpg") return resp1
- if判断语句