flask_study
安装:
windows环境下:
使用pycharm创建一个新的虚拟环境,在env环境下使用pip install flask安装即可
Linux环境下:
见python爬虫笔记
使用
配置文件settings,在这个文件中保存所有的配置信息。
env:环境,一般时开发环境,生产环境,测试环境
debug:一般适用于开发,测试环境,可以及时更新代码,并且会将错误信息返回页面
变量的类型:
默认str(不包含斜杠的字符串)
有 int,float,path(包含斜杠的字符串),uuid(唯一标识符)
代码语言:javascript复制from flask import Flask
from config import settings
app = Flask(__name__)
# print(app.config)
# # 因为默认的config配置文件有字典形式保存,所以可以通过key修改值
# app.config['DEBBUG'] = True
# 通过创建的setting文件和flask提供的from_object方法将配置文件读取
# 或者from_pyfile
app.config.from_pyfile('configsettings.py')
# app.config.from_object(settings)
dict_t = {
'a': '12',
'q': ('1', '2'),
'w': {'d': 'ct'}
}
@app.route('/')
def index():
return "hello world! 你好!"
# 上下两种方法等效,使用装饰器底层实现函数使用了add_url_rule
# def dex():
# return '1'
# app.add_url_rule('/inx', view_func=dex)
# 接受变量,同时视图函数只能返回字符串,字典,元组,response对象,wsgi类型其余的都会报错
@app.route('/index/<key>')
def set_test(key):
return dict_t.get(key)
@app.route('/test/<path:p>')
def path_test(p):
return p
# 在路由中定义斜杠,无论请求的url是否带有斜杠都可以执行视图函数,如果请求的是有斜杠的,则浏览器执行了一次重定向。
@app.route('/test/')
def test():
return 'test'
# 路由中,定义的路由没有以斜杠结尾,但请求的路由以斜杠结尾则会返回not found
@app.route('/ttt')
def ttt():
return 'ttt'
# 手动定义返回的状态码
@app.route('/test1')
def test1():
return 'test1', 404
def main():
app.run(host='0.0.0.0', port=8080, debug=True)
if __name__ == "__main__":
main()
补充:
路由转发的的优先级:越往上优先级越高。
当定义的路由以斜杠结尾,但请求的路由有没有斜杠结尾都可以实现请求。
在路由中定义斜杠,无论请求的url是否带有斜杠都可以执行视图函数,如果请求的是有斜杠的,则浏览器执行了一次重定向。
建议使用不以斜杠的路由定义。
response对象
对字符串而言,在底层上还是将字符串传入response对象,进行处理,返回给网页。
代码语言:javascript复制from flask import Flask
from config import settings
app = Flask(__name__)
# print(app.config)
# # 因为默认的config配置文件有字典形式保存,所以可以通过key修改值
# app.config['DEBBUG'] = True
# 通过创建的setting文件和flask提供的from_object方法将配置文件读取
# 或者from_pyfile
app.config.from_pyfile('configsettings.py')
# app.config.from_object(settings)
dict_t = {
'a': '12',
'q': ('1', '2'),
'w': {'d': 'ct'}
}
@app.route('/')
def index():
return "hello world! 你好!"
# 对于字符串而言,上面实际是执行了下面的方法来实现
@app.route('/indexs')
def indexs();
response = Response('hello world! 你好!')
print(response.content_type) # 查看相应体的类型
print(response.headers) # 查看相应体的相应头
print(response.status_code) # 查看相应码
print(response.status) # 查看相应状态
response.set_cookie('name', 'xxx') # 设置响应响应的cookie
return response
@app.route('/index/<key>')
def set_test(key):
return dict_t.get(key)
@app.route('/test/<path:p>')
def path_test(p):
return p
@app.route('/test/')
def test():
return 'test'
# 手动设置状态码
@app.route('/test1')
def test1():
return 'test1', 404
@app.route('/ttt')
def ttt():
return 'ttt'
# 设置端口号,debug模式
def main():
app.run(host='127.0.0.1', port=8080, debug=True)
if __name__ == "__main__":
main()
request对象
请求对象,客户端向服务器发送的请求。
代码语言:javascript复制from flask import Flask, make_response, Request, request
app = Flask(__name__)
app.config.from_pyfile("config/settings.py")
@app.route('/index')
def index():
# request对象,请求对象
# 可以查看到request的请求头,url,请求路由,cookie信息等
print(request.headers)
print(request.url)
print(request.path)
print(request.base_url)
res = make_response("asdasd")
return res
def main():
app.run(port=5002)
if __name__ == "__main__":
main()
render_template
test.html
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
div {
border: 2px solid red;
}
</style>
</head>
<body>
<div>
<!--使用name,在提交后执行action动作后,会在路由显示提交的内容-->
<form action="/join2" method="get">
<p><label>
<input type="text" name="username" placeholder="name">
</label></p>
<p><label>
<input type="text" name="address" placeholder="address">
</label></p>
<label>
<input type="submit" value="up">
</label>
</form>
</div>
</body>
</html>
py
代码语言:javascript复制from flask import Flask, make_response, Request, request, render_template
app = Flask(__name__)
app.config.from_pyfile("config/settings.py")
@app.route('/index')
def index():
# request对象,请求对象
# 可以查看到request的请求头,url,请求路由,cookie信息等
print(request.headers)
print(request.url)
print(request.path)
print(request.base_url)
res = make_response("asdasd")
return res
# 使用render_template方法将html文件转换成字符串并返回
@app.route('/join')
def join():
r = render_template("test.html")
return r
# html文件中,提交时自动跳转到join2路由
@app.route('/join2')
def join2():
# 打印主路径
print(request.path)
# 打印全路径
print(request.full_path)
# 打印提交的参数,类似字典,通过key取值,对于get方法
print(request.args)
# 打印提交的参数,类似字典,通过key取值,对于post方法
# print(request.form)
return 'join ok'
def main():
# 查看路由规则表
print(app.url_map)
app.run(port=8000)
if __name__ == "__main__":
main()
注意:
在导入自定义的settings文件,或者使用render_template方法时,如果出现一直model not found或文件渲染一直有问题,可以在File | Settings | Project: flask_demo | Project Structure将项目文件夹把几种设置都勾选上。(原因暂时不清楚)
url_for和redirect
redirect用于重定向
代码语言:javascript复制import json
from flask import Flask, make_response, Request, request, render_template, redirect, url_for
app = Flask(__name__)
app.config.from_pyfile("config/settings.py")
users = []
@app.route('/')
def index():
return render_template('special.html')
@app.route('/register', methods=['POST', 'GET'], endpoint='indexs')
def register():
if request.method == 'POST':
name = request.form.get('username')
pwd = request.form.get('password')
re_pwd = request.form.get('repassword')
if pwd == re_pwd:
user = {'name': name, 'password': pwd}
users.append(user)
show_data = json.dumps(users)
# return '注册成功' show_data '<a href="/">返回</a>'
# 重定向,传入要定向的页面,可以设置状态码
# url_for,根究传入的endpoint名称,返回对应路径
return redirect(url_for('indexs'))
else:
return '密码不一致'
return render_template('test.html')
if __name__ == '__main__':
app.run(port=5002)
模板语法
在html界面中可以动态的获取后台传入的参数
代码语言:javascript复制<!--模板语法的各种类型-->
<h1>{{ name }}</h1>
<h2>{{ age }}</h2>
<h3>{{ friends.1 }}</h3>
<h4>{{ t }}</h4>
代码语言:javascript复制<!--模板语法控制块-->
<!--for 循环结构-->
<!--if 判断结构-->
<ul>
<!-- {{ grils }}-->
{% for girl in grils %}
{% if girl|length >= 3 %}
<li> {{ girl }}</li>
{% else %}
<li class="color">{{ girl }}</li>
{% endif %}
{% endfor %}
</ul>
对于获取循环时的行数,可以使用loop变量
index 从1开始计数行数,index0从0开始计数行数,revindex倒序计数,revindex0倒序0开始,first 是否是第一行, last 是否是最后一行
可以选择在行内进行if 判断语句
过滤器
本质上是函数,对于一些不能直接在模板语法中使用的python语法,被封装成了过滤器
例如 ;
xxx | safe 禁止转义
在讲一些带有标签的数据传入html文件时,不想进行转义,使用safe
xxx | capitalize
单词首字母大写
lower 和 upper
大小写的转换
title 将一句话的每个单词首字母大写
format 格式化输出
{{ ’%s is %d‘ | format(‘asd’, 18) }}
truncate 截断
列表的过滤器:
list | length 获取列表的长度 list | first, last 获取第一个或最后一个元素
sum, sort 对整型元素而言
字典的操作: