Flask

Posted neozheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask相关的知识,希望对你有一定的参考价值。

Flask的特点:

- 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的主要内容,如果未能解决你的问题,请参考以下文章

12_关于flask中的宏

Flask之模板之宏继承包含

Flask模板宏的概念和基本使用

python flask(多对多表查询)

python后端 flask框架 计算时间差 并根据时间差条件返回flag值

python后端 flask框架 计算时间差 并根据时间差条件返回flag值