- pip install flask
- 短小精悍, 可扩展性强的 web 框架
注意: 上下文管理机制
- 依赖 wsgi:werkzeug
Flask 的简单示例:
- from flask import Flask
- # App = Flask(__name__,template_folder="templates",static_folder="static",static_url_path="/vvv") # template_folder(默认为 templates ),static_folder(默认为 static) 都是在这里设置; static_url_path="/vvv": 设置静态文件的路径 (给静态文件 statci 的路径设置一个别名; 用在模板中)
- App = Flask(__name__)
- @App.route("/index") # 装饰器表示 路径和函数 绑定
- def index():
- return "hello world"
- if __name__ == "__main__":
- App.run() # 启动 socket
Flask 登陆示例:
目录结构:
- project
- |-- static
- |-- 1.PNG
- |-- templates
- |-- index.txt
- |-- login.html
- |-- flask_login.py
flask_login.py
- from flask import Flask,request,render_template,redirect,session
- App = Flask(__name__)
- App.secret_key = "nbaoireunbadfo" # 设置 session 的时候, 需要加盐加密
- @App.route("/login",methods=["GET","POST"])
- def login():
- if request.method == "GET":
- return render_template("login.HTML")
- username = request.form.get("username")
- password = request.form.get("psw")
- if username == "neo" and password == "abc123":
- session["user"] = username # 设置 session
- return redirect("/index")
- else:
- return render_template("login.HTML", error="用户名密码错误") # 传递参数也可用字典
- @App.route("/index")
- def index():
- # 登陆之后才能访问 index 页面
- if not session.get("user"): # 获取 session
- return redirect("/login")
- return render_template("index.txt") # 模板后缀不影响
- if __name__ == "__main__":
- App.run()
- """
- 小结:
- from flask import request # Flask 的请求数据是这样导入的, 不是像 Django 那样通过参数传递的
- from flask import render_template # 渲染的模板
- render_template(模板名,**{"传递的参数": 传递的参数})
- from flask import redirect # 重定向
- from flask import session # session;flask 中 session 默认是以加密的方式保存在了用户浏览器的 cookie 中; 所以要设置加盐 (加密)
- App.secret_key = "apiofdgqpweu" # session 加密加盐
- request.methods # 获取请求方式
- request.args # 获取 GET 请求的数据, 对应 Django 的 request.GET (url 里面传过来的参数)
- request.form # 获取 POST 提交过来的数据, 对应 Django 的 request.POST(请求体里面传过来的参数)
- @App.route("/login",methods=["GET","POST"]) # methods=["GET","POST"] 表示可接收 GET 和 POST 请求, 默认只接收 GET
- # 默认的 模板文件夹叫 templates; 默认的静态文件叫 static
- # <form > 表单只能发送 get 和 post 请求, patch 和 delete 请求要通过 Ajax 发送
- """
- templates/index.txt
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <h3 > 欢迎登陆 </h3>
- <img src="/static/1.PNG" alt=""> # src 中的 /static 可更改, 通过 static_url_path 设置
- </body>
- </HTML>
- templates/login.HTML
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <form action=""method="post">
- <input type="text" name="username">
- <input type="password" name="psw">
- <input type="submit" value="提交"> <span>{{error}}</span>
- <!-- {{ }} 用于传递参数 -->
- </form>
- </body>
- </HTML>
配置文件:
- # 通过字符串找到类中的静态字段, 如 "settings.Foo" 中的静态字段
- # 通过字符串找到类中的静态字段, 如 "settings.Foo" 中的静态字段
- import importlib
- path = "settings.Foo"
- module_path,class_name = path.rsplit(".",1)
- module = import.importlib(module_path)
- cls = getattr(module,class_name)
- for key in dir(cls): # dir(cls) : 返回一个列表, 其中包含静态字段
- if key.isupper(): # 静态字段得是大写
- print(key,getattr(cls,key)) # 获取静态字段及对应的值
设置配置文件:
# settings.py
class Config(object): 共用的配置信息
TESTING = False
class ProductionConfig(Config): 生产环境下的配置
- DEBUG = False
- class DevelopmentConfig(Config):
- DEBUG = True
- # App.py
- from flask import Flask
- App = Flask(__name__)
- # App.config # 获取 Flask 的 配置文件
- # App.config.from_object("python 类或类的路径") # 设置配置文件
- # 也可以这样单独设置配置信息:
- # App.config["DEBUG"] = True
- App.config.from_object("settings.DevelopmentConfig")
- if __name__ == "__main__":
- App.run()
路由系统
@App.route() 这个路由中的参数 endpoint="xx" : 给该路径起一个别名 (相当于 django url 中的 name), 如果 endpoint 不写, 默认是函数名; 通过别名反解路径: url_for("xx") , url_for 需要导入
- # 路由的动态传参
- @App.route("/index/<int:nid>",method=["GET","POST"],endpoint="url1") # 路由中传参时, 视图函数中需要接收一下; 如果 int 不写, 则默认是字符串格式
- def index(nid): # 接收参数
- print(url_for("url1",nid=777)) # 反解路径时, 如果 url 中动态传参了, 需要在后面指定传的参数
- return "Index"
- # 动态传参时的类型包括: string,int,float 和 path; 如果不指定, 默认是 string
- Flask
来源: http://www.bubuko.com/infodetail-2800987.html