目录
- 一、flask简介
- 1.1什么是flask?
- 1.2Django、flask、tornado三大框架的对比
- 二、环境的准备
- 2.1搭建虚拟环境
- 三、基础介绍
- 3.1flask框架起步与flask框架四剑客
- 3.2Response四剑客
- 3.3flask的配置文件
- 3.4路由的本质以及add_urll_rule参数
- 3.5路由正则
- 3.6flask的cbv写法
- 3.7模板渲染
- 3.8flask的请求与响应
- 3.9flask的session操作
- 3.10flask的闪现
一、flask简介
1.1什么是flask?
Flask是一个python编写的web微框架,使用flask我们可以使用python快速实现一个网站或web服务。
1.2Django、flask、tornado三大框架的对比
Django
Django是同步框架,orm和模板都是自己的,使用Django可以快速开发一个比较大的项目。该框架内置模块很多,模板、表单、路由、数据库管理等功能都可以通过这些模块实现。
优点:内置大量模块,可以通过这些模块去实现功能,减少开发者的代码量。
缺点:由于内置模块太多,项目占内存比较大,不适合实现功能较少的小项目。
flask
flask是同步框架,orm不是自己的、模板使用jinjia2模板,适用于小项目,也能做大项目但有些东西需要使用第三方组件或者自己写。
torando
异步框架、微框架、高性能,适用于大量连接、长轮询、WebSockets的应用。
二、环境的准备
2.1搭建虚拟环境
虚拟环境是隔离的Python解释器环境。通过创建虚拟环境,你可以拥有一个独立的Python解释器环境,相当于对全局的python解释器环境拷贝一份私有的副本, 这样做的好处是可以为每一个项目创建独立的Python解释器环境,因为不同的项目常常会依赖不同版本的库或Python版本。
2.1.1方式一:使用pycharm创建
如下图所示新建项目的时候选择虚拟环境。
2.1.2方式二:命令行搭建虚拟环境
windows的开发环境的安装过程,我们使用的是virtualenv虚拟开发环境,首先安装相关包的依赖
代码语言:javascript复制pip install virtualenvwrapper-win
利用安装好的模块我们创建一个虚拟环境
注意:这个‘’first_01_env‘’ 是我们自己给虚拟环境取的名字,并且要记录一下图(1)的安装路径,一会我们需要使用。
代码语言:javascript复制mkvirtualenv first_01_env
虚拟环境其他相关命令: 01、切换到指定的虚拟环境:注意我们进入虚拟环境是需要用workon命令,但是首次安装成功会自动进入虚拟环境。
代码语言:javascript复制workon first_01_env
02、退出虚拟环境
代码语言:javascript复制deactivate
03、删除指定的虚拟环境
代码语言:javascript复制rmvirtaulenv first_01_env
04、列出所有虚拟环境:
代码语言:javascript复制lsvirtualenv
05、进入到虚拟环境所在的目录:
代码语言:javascript复制cdvirtualenv
2.1.3安装Flask模块
创建好虚拟环境然后执行:
代码语言:javascript复制pip install flask
三、基础介绍
3.1flask框架起步与flask框架四剑客
代码语言:javascript复制from flask import Flask#导入flask类
app = Flask(__name__)#实例化一个Flask对象
__name__是模块的名称或者包的名称 作用: 根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径;也可以说这里的app就是一个程序实例,客户端(一般是浏览器)将请求发送给服务端Web服务器,Web服务器再把请求发给Flask实例。
3.2Response四剑客
类似于Django的response,flask也有四种响应方式
1.直接返回字符串,类似于Django的HttpResponse
2.返回一个HTML页面使用render_template,类似于Django的render
3.重定向,用于页面的跳转:redirect
4.将序列化的数据转换为json类型返回到前端:jsonify
代码语言:javascript复制from flask import Flask,render_template,redirect,jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "ok"
@app.route("/index")
def index1():
return render_template("index.html")
@app.route("/login")
def index2():
return redirect("/")
@app.route("/test")
def json11():
data ={'test1':"T1",'test2':"Test2"}
return jsonify(data)
if __name__ == '__main__':
app.run()
3.3flask的配置文件
3.3.1方式一(app属性的方式)
它只能配置两项,一个是debug 一个secert_key
代码语言:javascript复制app.debug=True
3.3.2方式二(app.config字典的形式)
代码语言:javascript复制app.config["DEBUG"] =True
3.3.3方式三(以一个py文件作为配置文件)
代码语言:javascript复制app.config.from_pyfile("setting.py")
我们可以在settings.py中写配置代码。
3.3.4方式四(以类的形式,推荐使用)
代码语言:javascript复制app.config.from_object("settingobj.TestConfig")
settingsobj是一个独立的py文件,我们在这个文件中以类的形式定义配置,这样当我们需要使用哪项配置时直接settingobj.类名就可以了。
代码语言:javascript复制class Config:
DEBUG = False
class ProductConfig(Config):
pass
class TestConfig(Config):
DEBUG = True
3.4路由的本质以及add_urll_rule参数
flask通过@app.route("路由后半部分"),route内部代码会将其余前面的url拼接成一条完整的路由。
代码语言:javascript复制from flask import Flask,url_for
app = Flask(__name__)
# @app.route("/")
def index():
return "ok"
@app.route("/")和底下的app.add_url_rule一样。
如果写成下面的形式,就相当于django中的url文件。
add_url_rule参数中的endpoint的作用:是做反向解析
methods=["POST","GET"]) 这里的methods用来限制请求方式。
app.add_url_rule("/index2/<int:yy>",view_func=index2)有名分组,yy用于接收参数。在flask中只有有名分组。
代码语言:javascript复制app.add_url_rule("/", view_func=index,endpoint="index12333444",methods=["POST","GET"])
def index1():
print(url_for("index12333444"))
return "123"
app.add_url_rule("/index1",view_func=index1,strict_slashes=False,redirect_to="/index2")
def index2(yy):
print(yy)
return "123445"
#只有有名分组
app.add_url_rule("/index2/<int:yy>",view_func=index2)
if __name__ == '__main__':
app.run()
3.5路由正则
步骤:
1.写类,继承BaseConverter 2.注册:app.url_map.converters['regex'] = RegexConverter 3.使用:@app.route('/index/<regex("d "):nid>') 正则表达式会当作第二个参数传递到类中
代码语言:javascript复制from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter
app = Flask(import_name=__name__)
class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
"""
print("to_python",type(value),value)
return int(value)
def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
"""
print("to_url", type(value), value)
val = super(RegexConverter, self).to_url(value)
return val "123"
# 添加到flask中
app.url_map.converters['regex'] = RegexConverter
@app.route('/index/<regex("d "):nid>')
def index(nid):
print("nid",type(nid),nid)
print(url_for('index', nid='888'))
return 'Index'
if __name__ == '__main__':
app.run()
3.6flask的cbv写法
代码语言:javascript复制from flask import Flask,views,url_for
app = Flask(__name__)
#如果继承的是views.View必须实现 def dispatch_request(self):
class IndexView(views.View):
methods = ["POST","GET"]
#decorators= ["装饰器的函数对象",]
def dispatch_request(self):
return "index"
#app.add_url_rule("/index",view_func=view)(View中as_view函数中嵌套的view)
app.add_url_rule("/index",view_func=IndexView.as_view(name="index"))
class LoginView(views.MethodView):
def post(self):
return "post"
def get(self):
print(url_for("123"))
return "get"
app.add_url_rule("/login",view_func=LoginView.as_view(name="login"))
if __name__ == '__main__':
app.run()
3.7模板渲染
代码语言:javascript复制from flask import Flask,render_template,Markup
app = Flask(__name__)
def ff(arg,b):
return Markup(arg b)
@app.route("/")
def index():
a = 123
list_info ={
1:{"name":"TT","long":160,"颜值":50},
2:{"name":"KK","long":170,"颜值":60},
3:{"name":"GG","long":190,"颜值":80}
}
html ="<h1> TT is sb</h1>"
return render_template("index1.html",num=a,user_dic = list_info ,htm=html,ff=ff)
if __name__ == '__main__':
app.run()
3.8flask的请求与响应
代码语言:javascript复制from flask import Flask,request,render_template,redirect,jsonify,make_response
app = Flask(__name__)
@app.route("/")
def inde():
#请求相关的
print("request.method",request.method)
print("request.args",request.args)
print("request.form",request.form)
print("request.values",request.values)
#响应相关的
# response = make_response("ojbk")
response = make_response(render_template("index.html"))
# response.set_cookie("name","TT is dsb")
response.delete_cookie("name")
response.headers["x-ssss"] = "jason is sb"
return response
if __name__ == '__main__':
app.run()
3.9flask的session操作
3.9.1django的seesion使用步骤
1.先产生一个随机的字符串,key
2.存key-->session对应,存数据库
3.把它key传到前端,设置cookies
3.9.2flask的sessoin存的步骤
第一步将session的这个字典做加密得到val,
第二步将配置文件中SESSION_COOKIE_NAME作为key,
第三步设置cookies,以上述的key,val做键值
3.9.2flask的session取的步骤
第一步,获取cookies中键为SESSION_COOKIE_NAME的值,
第二步: 将第一步获取的值做解密操作得到真的val值
代码语言:javascript复制from flask import Flask,session
app = Flask(__name__)
app.secret_key = "aihsdasnd"
app.config['SESSION_COOKIE_NAME']="sbd"
3.10flask的闪现
闪现的特点: 1.没有设置,取是不会报错的,返回一个空列表 2.设置了就可以在任何一个视图函数中去取 3.取了一次就没有了。(但是在同一次请求中可以取多次)
代码语言:javascript复制from flask import Flask,flash,get_flashed_messages
app = Flask(__name__)
app.secret_key="aosjdaois"
@app.route("/")
def index1():
flash("Test1")
return "333"
@app.route("/index")
def index():
flash("Test2")
flash("Test3","Key")
return "123"
@app.route("/login")
def login():
print(get_flashed_messages(with_categories=True))
print(get_flashed_messages(category_filter=("Key")))
return "ok"
if __name__ == '__main__':
app.run()