Flask入门
引子:
以前用的都是django,现在公司主要在用flask做自动化平台,所以今天开始学习flask,作为python流行的三大框架之一,flask与Django形成了鲜明的对比,一个是大而全一个是小而精,但是flask拥有丰富的第三方插件,这2个框架我感觉是2种不同的思想,django各种工具封装的特别完善比如orm,form,modelform,中间件等,所以开发速度是比较快速的,但是flask不是,但是因为各种第三方插件的加持,flask的可定制性要必django高,经过学习发现2个框架有很多相似的地方。
flask简单的入门:
与django的app不同,flask每一个py文件就是一个app
from flask import Flask app = Flask(__name__) # app.route 通过 route内部定义的 url_map 匹配到视图函数 # 这时候已经拿到了对象 获取到请求 则执行对象的__call__方法 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': """ 监听用户请求 如果有用户请求到来 则执行app__call__方法 也是flask 的请求入口 """ #app.__call__ app.run()
flask实现简单的接口登陆检校:
# -*- coding: utf-8 -*- import functools from flask import Flask,render_template,request,redirect,session,url_for app=Flask(__name__) app.secret_key='yuan' app.config["DEBUG"]=True USERS={ 1:{"name":"yuan","age":18,"gender":"man","detail":"与django 的模版语法1"}, 2:{"name":"wang","age":38,"gender":"woman","detail":"与django 的模版语法2"}, 3:{"name":"yuanbao","age":6,"gender":"man","detail":"与django 的模版语法3"} } def get_cook(func): @functools.wraps(func) def inner(*args,**kwargs): user_info=session.get("user_info") if user_info: print(user_info) ret=func(*args,**kwargs) return ret else: return redirect("/login") return inner @app.route('/index',methods=["GET",]) @get_cook def index(): # user=session.get("user_info") # if not user: # return redirect("/login") return render_template("index.html",user_dict=USERS) @app.route("/detail/<int:id>",) def detail(id): """ flask 不像django 不支持正则 用这种方法来传值 也可以直接传id 不规定拿到的值类型/detail/<int:id> :param id: :return: """ user=session.get("user_info") if not user: """ url_for 类似与django 路由的反向生成 url=url_for("l1",id=123) """ url=url_for("l1") return redirect(url) detail=USERS.get(id).get("detail") return render_template("detail.html",detail=detail) # endpoint url 别名 @app.route('/login',methods=['GET',"POST"],endpoint='l1') def login(): if request.method == "GET": return render_template("login.html") elif request.method == "POST": request_head_obj=request.query_string request_body_obj=request.form user=request_body_obj.get("user") pwd = request_body_obj.get("pwd") if user == "yu" and pwd =="123": session["user_info"]=user return redirect("http://www.baidu.com") return render_template("login.html",error_msg="用户名或密码错误") if __name__ == '__main__': app.run()