Flask框架总结

Flask介绍:

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

大白话说就是:短小精悍,轻量

和django对比:

1django:无socket,依赖第三方模块wsgi,中间件,路由系统(CBVFBV),视图函数,ORM。cookie,session,Admin,Form,缓存,信号,序列化。。 2 Flask: 无socket,中间件(扩展),路由系统,视图(CBV)、第三方模块(依赖jinja2),cookie,session弱爆了

大白话说就是:这个框架和django比起来几乎就是什么都没有,只需要简单的引用就可以了,想要插件引用就可以了!但是这也是Flask的缺点,因为遇到任何复杂的业务都需要引用第三方模块,导致Flask比django不稳定一些,开发大型项目也不推荐用Flask,因为当第三方插件用多了之后就更加不容易后期的维护了!

使用:

1pip3 install flask 2 3from flask import Flask 4app = Flask(__name__) 5 6@app.route('/') 7def hello_world(): 8 return 'Hello World!' 9 10if __name__ == '__main__': 11 app.run()

实例化Flask对象,里面是有参数的

app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')

两种添加路由的方式

1方式一: 2 @app.route('/xxxx') # @decorator 3 def index(): 4 return "Index" 5方式二: 6 def index(): 7 return "Index" 8 app.add_url_rule('/xxx', "n1", index) #n1是别名

Flask中装饰器应用

1from flask import Flask,render_template,request,redirect,session 2app = Flask(__name__) 3app.secret_key = "sdsfdsgdfgdfgfh" 4 5def wrapper(func): 6 def inner(*args,**kwargs): 7 if not session.get("user_info"): 8 return redirect("/login") 9 ret = func(*args,**kwargs) 10 return ret 11 return inner 12 13@app.route("/login",methods=["GET","POST"]) 14def login(): 15 if request.method=="GET": 16 return render_template("login.html") 17 else: 18 # print(request.values) #这个里面什么都有,相当于body 19 username = request.form.get("username") 20 password = request.form.get("password") 21 if username=="haiyan" and password=="123": 22 session["user_info"] = username 23 # session.pop("user_info") #删除session 24 return redirect("/index") 25 else: 26 # return render_template("login.html",**{"msg":"用户名或密码错误"}) 27 return render_template("login.html",msg="用户名或者密码错误") 28 29@app.route("/index",methods=["GET","POST"]) 30@wrapper 31def index(): 32 # if not session.get("user_info"): 33 # return redirect("/login") 34 return render_template("index.html") 35 36 37if __name__ == '__main__': 38 app.run(debug=True)

请求响应相关

1- request 2 - request.form #POST请求 3 - request.args #GET请求 字典形式的 4 - request.querystring #GET请求,bytes形式的 5 - response 6 - return render_tempalte() 7 - return redirect() 8 - return "" 9 v = make_response(返回值) #吧返回的值包在了这个函数里面 10 - session 11 - 存在浏览器上,并且是加密的 12 - 依赖于:secret_key

flask配置文件

1flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: 2 { 3 'DEBUG': get_debug_flag(default=False), 是否开启Debug模式 4 'TESTING': False, 是否开启测试模式 5 'PROPAGATE_EXCEPTIONS': None, 6 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 7 'SECRET_KEY': None, 8 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), 9 'USE_X_SENDFILE': False, 10 'LOGGER_NAME': None, 11 'LOGGER_HANDLER_POLICY': 'always', 12 'SERVER_NAME': None, 13 'APPLICATION_ROOT': None, 14 'SESSION_COOKIE_NAME': 'session', 15 'SESSION_COOKIE_DOMAIN': None, 16 'SESSION_COOKIE_PATH': None, 17 'SESSION_COOKIE_HTTPONLY': True, 18 'SESSION_COOKIE_SECURE': False, 19 'SESSION_REFRESH_EACH_REQUEST': True, 20 'MAX_CONTENT_LENGTH': None, 21 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), 22 'TRAP_BAD_REQUEST_ERRORS': False, 23 'TRAP_HTTP_EXCEPTIONS': False, 24 'EXPLAIN_TEMPLATE_LOADING': False, 25 'PREFERRED_URL_SCHEME': 'http', 26 'JSON_AS_ASCII': True, 27 'JSON_SORT_KEYS': True, 28 'JSONIFY_PRETTYPRINT_REGULAR': True, 29 'JSONIFY_MIMETYPE': 'application/json', 30 'TEMPLATES_AUTO_RELOAD': None, 31 } 32 33方式一: 34 app.config['DEBUG'] = True 35 36 PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...) 37 38方式二: 39 app.config.from_pyfile("python文件名称") 40 如: 41 settings.py 42 DEBUG = True 43 44 app.config.from_pyfile("settings.py") 45 46 app.config.from_envvar("环境变量名称") 47 环境变量的值为python文件名称名称,内部调用from_pyfile方法 48 49 50 app.config.from_json("json文件名称") 51 JSON文件名称,必须是json格式,因为内部会执行json.loads 52 53 app.config.from_mapping({'DEBUG':True}) 54 字典格式 55 56 app.config.from_object("python类或类的路径") 57 58 app.config.from_object('pro_flask.settings.TestingConfig') 59 60 settings.py 61 62 class Config(object): 63 DEBUG = False 64 TESTING = False 65 DATABASE_URI = 'sqlite://:memory:' 66 67 class ProductionConfig(Config): 68 DATABASE_URI = 'mysql://user@localhost/foo' 69 70 class DevelopmentConfig(Config): 71 DEBUG = True 72 73 class TestingConfig(Config): 74 TESTING = True 75 76 PS: 从sys.path中已经存在路径开始写 77 78 79 PS: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则就是instance_path目录 80 81配置文件

一、Flask之路由

常用五种方式

1@app.route('/user/<username>') #常用的 不加参数的时候默认是字符串形式的 2@app.route('/post/<int:post_id>') #常用的 #指定int,说明是整型的 3@app.route('/post/<float:post_id>') 4@app.route('/post/<path:path>') 5@app.route('/login', methods=['GET', 'POST'])

其它内容日后补充......

二、视图函数

CBV

1def auth(func): 2 def inner(*args, **kwargs): 3 result = func(*args, **kwargs) 4 return result 5 return inner 6 7 class IndexView(views.MethodView): 8 # methods = ['POST'] #只允许POST请求访问 9 decorators = [auth,] #如果想给所有的get,post请求加装饰器,就可以这样来写,也可以单个指定 10 11 def get(self): #如果是get请求需要执行的代码 12 v = url_for('index') 13 print(v) 14 return "GET" 15 16 def post(self): #如果是post请求执行的代码 17 return "POST" 18 19 app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) #name指定的是别名,会当做endpoint使用 20 21 if __name__ == '__main__': 22 app.run()

FBV

1方式一: 2 @app.route('/index',endpoint='xx') 3 def index(nid): 4 url_for('xx',nid=123) 5 return "Index" 6 7 方式二: 8 def index(nid): 9 url_for('xx',nid=123) 10 return "Index" 11 12 app.add_url_rule('/index',index)

二、请求与相应

1from flask import Flask 2 from flask import request 3 from flask import render_template 4 from flask import redirect 5 from flask import make_response 6 7 app = Flask(__name__) 8 9 10 @app.route('/login.html', methods=['GET', "POST"]) 11 def login(): 12 13 # 请求相关信息 14 # request.method 15 # request.args 16 # request.form 17 # request.values 18 # request.cookies 19 # request.headers 20 # request.path 21 # request.full_path 22 # request.script_root 23 # request.url 24 # request.base_url 25 # request.url_root 26 # request.host_url 27 # request.host 28 # request.files 29 # obj = request.files['the_file_name'] 30 # obj.save('/var/www/uploads/' + secure_filename(f.filename)) 31 32 # 响应相关信息 33 # return "字符串" 34 # return render_template('html模板路径',**{}) 35 # return redirect('/index.html') 36 37 # response = make_response(render_template('index.html')) 38 # response是flask.wrappers.Response类型 39 # response.delete_cookie('key') 40 # response.set_cookie('key', 'value') 41 # response.headers['X-Something'] = 'A value' 42 # return response 43 44 45 return "内容" 46 47 if __name__ == '__main__': 48 app.run()

其它基础内容还有:

模板语法、session、blueprint蓝图、flash

日后总结......

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang