今天跟大家分享下,我之前关于flask学习的一些笔记。如果有志同道合的朋友可以互相交流交流。
Flask是第三方框架。
第一方是python官方吉多,第二方我们开发者自己,第三方框架工具类提供者。
虚拟环境
一个特殊的文件夹,里面放着程序所需要的各种环境,比如扩展包,flask版本,python解释器等内容。
不同程序选用不同虚拟环境互不影响。
知名的框架?
web:
1.flask: 提供基本功能,属于轻量级
2.django: 提供相对完整功能,重量级
3.tornado: 偏嵌入式web应用,非阻塞式服务器
爬虫类:
scrapy
分布式:
spark
大数据:
hadoop
人工智能:
scikit-learn
apache:
美国软件基金会组织,里面提供的都是开源框架,而且免费,比如,Tomcat,HBase,Activty..等等350多个
七行灵魂代码(默认端口5000)
#1.导入Flask类
from flask import Flask
#2.创建Flask对象接收一个参数__name__,它会指向程序所在的包
app = Flask(__name__)
#3.装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
#4.Flask应用程序实例的run方法,启动WEB服务器
if __name__ == '__main__':
app.run()
Flask 初始化参数
import __name__:Flask 程序所在的包,传__name__就可以,
其可以决定flask在访问静态文件时查找的路径。
static_url_path 静态文件访问路径,可以不传默认为/+static。
static_folder :静态文件存储的文件夹,可以不传默认为static。
template_folder:模板文件存储的文件夹,可以不传,默认为templates。
Flask相关配置的加载方式
在 Flask 程序运行的时候,可以设置相关配置比如:配置 Debug 模式(修改代码不需要关闭程序,可以实时生效,如果代码错误会给出友好提示),配置数据库连接地址等,设置 Flask配置有以下三种方式:
从配置对象中加载(常用)
app.config.from_object()
从配置文件中加载 app.config.from_pyfile()
从环境变量中加载(了解) app.config.from_envvar()
# 配置对象,里面定义需要给 APP 添加的一系列配置
class Config(object):
DEBUG = True
# 从配置对象中加载配置
app.config.from_object(Config)
一.指定路由地址
# 指定访问视图函数demo1,访问路径为/demo1
第一种
@app.route('/demo1')
def demo1():
return 'demo1'
解决循环导包的方式是将非主模块在主模块中导入
第二种
#先定义函数后用app装饰
副模块 def detail():
return ‘detail’
在主模块中app,route(‘/detail’)(detail)
二.给路由传参示例
有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。
# 路由传递参数,整数
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'the num is %d' % user_id
# 路由传递参数,字符串,不指定path默认就是字符串
@app.route('/user/<path:user_id>')
def user_info(user_id):
return 'hello %s' % user_id
提示:之所以int,path,float可以接收整数,字符串,小数,是由于werkzeug提供了IntegerConverter,PathConverter对应转换器.
当系统提供的转换器满足不了需求,需要自定义
固定格式:
1. 自定义类(转换器),继承自BaseConverter
2. 编写init方法,接收两个参数
3. 一个参数给父类空间初始化, 另外一个给子类规则初始化
4. 将自定义的转换器,添加到系统默认的转换器列表中 (app.url_map.converters)
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1. 自定义类(转换器),继承自BaseConverter
class MyRegexConverter(BaseConverter):
#不能写死,不够灵活
# regex = '\d{3}'
# 2.编写init方法, 接收两个参数
def __init__(self,url_map,regex):
# 3.一个参数给父类空间初始化, 另外一个给子类规则初始化
super(MyRegexConverter, self).__init__(url_map)
self.regex = regex
# 4. 将自定义的转换器,添加到系统默认的转换器列表中(app.url_map.converters)
app.url_map.converters["re"] = MyRegexConverter
print(app.url_map.converters)
#re()好比是调用了init方法,参数1:app.url_map, 参数2:是括号里面内容
@app.route('/<re("\d{3}"):number>')
def hello_world(number):
return "the number is %s"%number
jsonify(返回的json数据可以被ajax接收并在方法中可以调用处理)
后端返回指定的json数据类型给前端浏览器使用,jsonify生成json数据响应体。
return jsonify(dict)
简化为 return jsonify(key=value,key=value)
return jsonify(name=’zhangsan’,age=”13”)
重定向
redirect(重定向),url_for,生成文本响应体
格式: redirect("地址") 自动向地址中跳转视图函数
注意点: redirect有个代号叫做302
url_for: 反解析,根据视图函数名称,找到路径,好处:可以传递参数
格式:url_for('视图函数',key=value)
@app.route('/rng')
def rng():
return redirect(url_for('lpl', token=1))
@app.route('/lol')
def lol():
return '我们有最棒的比赛<a href=%s>lpl</a>'%url_for('lpl',token=2)
@app.route('/lpl/<int:token>')
def lpl(token):
if token == 1:
return "我们是冠军"
elif token == 2:
return "这里是世界最强的赛区lpl!"
else:
return "LPL今年S8夺冠!"