flask 入门基础
一,python三大框架比较
Flask:
优点:小而精,短小精悍,第三方组件特别多,
缺点:组件更新速度取决于开源
Tornado
优点:原生的webSocket,异步任务,IO非阻塞
缺点:组件没有,session都没有,支持jaj2
Django:
优点:大而全,组件非常全面
缺点:太大,加载太大,浪费资源,
flask启动,安装flask
三行代码启动flask
1 创建flask实例: 第一个hello
实例对象
2
蓝图中可以使用以上配置
3 . 应用配置 (自动执行)
二,flask三剑客
1, Flask 中的 Render Redirect HttpResponse
在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串
2.Flask中的Redirect
每当访问"/redi"这个地址的时候,视图函数redi会触发redirect("/") 跳转到url地址: "/" 并会触发"/"对应的视图函数index()
3.Flask 中的 render (render_template)
HTML模板渲染是每个Web框架中都必须有的,至于render_template的具体用法,留个悬念,往后看
注意: 如果要使用 render_template 返回渲染的模板,请在项目的主目录中加入一个目录 templates
否则可能会有一个Jinja2的异常哦
遇到上述的问题,基本上就是你的template的路径问题
werkzeug相当于wsgi
run-simple监听端口
HTTPresponse: return "Hello OldBoyEDU" render_template: return render_template("login.html") #templates redirect: return redirect("/login") from flask import Flask, render_template, redirect apl = Flask(__name__) # Httpresponse @apl.route("/index") def index(): return "Hello OldBoyEDU" # render_template @apl.route("/login") def login(): return render_template("login.html") # redirect @apl.route("/") def root_path(): return redirect("/login") apl.run()
三,Request:
request.method 获取请求方式 request.form 获取FromData数据(通常情况下的POST请求) request.args 获取GET方式提交的数据 request.files 获取file request.url_about 获取所有的关于URL的参数 request.values 获取全部提交方式 to_dict 坑,覆盖,GET覆盖POST request.headers 获取头部信息 request.cookie 获取客户端cookie request.json 数据头:application/json request.data 在没有任何数据头的情况提交的POST request.path(类) url相关,路径相关
四,模板语言:Jinja2 模板语言的标准
Flask 基于 Jinja2 做了一层小小小小小小的封装 向前端传递数据 render_template 参数传递 stu = {k1:v1} {{ stu }} <td>{{ stu.name }}</td> <td>{{ stu["age"] }}</td> {% if stu.get("gender") == "中" %} <td>男</td> {% else %} <td>{{ stu.get("gender") }}</td> {% endif %} STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73, 'gender': '男'}, {'name': 'EDU', 'age': 84, 'gender': '女'} ] <td>{{ stu.0.name }}</td> <td>{{ stu[0]["age"] }}</td> {% if stu[0].get("gender") == "中" %} <td>男</td> {% else %} <td>{{ stu.0.get("gender") }}</td> {% endif %} 安全字符串: {{ input | safe }} Markup() : Markup("<input type='text' name='input_tag'>") @apl.template_global() 全局 def a_b_sum(a,b): return a+b {{ a_b_sum(123,234) }} @apl.template_filter() 上继承下继承 def a_b_c_sum(a,b,c): return a+b+c {{ 123 | a_b_c_sum(1,2) }}
五,登录查看学生信息
form flask import session app.secret_key = "随意" session["user"] = "xxxx" if session.get("user")
六,Flask 路由 :
"/index"路由地址 "/index/<nid>" 动态路由地址(视图函数需要nid参数) "/index/<int:nid>" 动态路由地址 methods=["GET","POST"] 允许URL的请求方式 endpoint="index" 反向URL操作,可以解决Inner重名的问题 redirect_to="/index2" 服务器端页面跳转 strict_slashes=False 可以使用"/"结尾 反之不可以 defaults={"nid":1} 视图函数默认参数 endpoint : 反向url地址,默认为视图函数名 (url_for) Urlfor 反向解析 from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info") def student_info(): print(url_for("r_info")) # /info stu_id = int(request.args["id"]) return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}" redirect_to 重定向 url后面加/ 怎么样才能访问 strict_slashes=False # 访问地址 : /info 浏览器跳转至 /infos @app.route("/info", strict_slashes=True, redirect_to="/infos") def student_info(): return "Hello Old boy info" @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos" defaults : 视图函数的参数默认值{"nid":1} from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100}) def student_info(nid): print(url_for("r_info")) # /info # stu_id = int(request.args["id"]) print(nid) # 100 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}" strict_slashes : url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/" # 访问地址 : /info @app.route("/info", strict_slashes=True) def student_info(): return "Hello Old boy info" # 访问地址 : /infos or /infos/ @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos" subdomain : 子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com" app.config["SERVER_NAME"] = "oldboy.com" @app.route("/info",subdomain="DragonFire") def student_info(): return "Hello Old boy info" # 访问地址为: DragonFire.oldboy.com/info
2.动态参数路由:
from flask import url_for # 访问地址 : http://127.0.0.1:5000/info/1 @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info") def student_info(nid): print(url_for("r_info",nid=2)) # /info/2 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}" <int:nid> 就是在url后定义一个参数接收 但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常
七,Flask的优势
Flask中的Werkzuge原理,__call__() Flask的第一个Hello OldBoyEDU Flask的 HTTPresponse render_template redirect Flask中的 request Flask中的 Jinja2 ,Markup Flask中的 session secret_key Flask中的路由系统 url_for
安全字符串
markup:安全
安全性保障
flask
app = Flask(__name__,#初始化参数)
app.Debug = True
app.config["Debug"] = True
八,Flask配置
DEBUG = True app.config["secret_key"] = "xxxxx" TESTING = True { 'DEBUG': False, # 是否开启Debug模式 'TESTING': False, # 是否开启测试模式 'PROPAGATE_EXCEPTIONS': None, # 异常传播(是否在控制台打印LOG) 当Debug或者testing开启后,自动为True 'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一两句话说不清楚,一般不用它 'SECRET_KEY': None, # 之前遇到过,在启用Session的时候,一定要有它 'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天 'USE_X_SENDFILE': False, # 是否弃用 x_sendfile 'LOGGER_NAME': None, # 日志记录器的名称 'LOGGER_HANDLER_POLICY': 'always', 'SERVER_NAME': None, # 服务访问域名 'APPLICATION_ROOT': None, # 项目的完整路径 'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字 'SESSION_COOKIE_DOMAIN': None, # 在哪个域名下会产生session记录在cookies中 'SESSION_COOKIE_PATH': None, # cookies的路径 'SESSION_COOKIE_HTTPONLY': True, # 控制 cookie 是否应被设置 httponly 的标志, 'SESSION_COOKIE_SECURE': False, # 控制 cookie 是否应被设置安全标志 'SESSION_REFRESH_EACH_REQUEST': True, # 这个标志控制永久会话如何刷新 'MAX_CONTENT_LENGTH': None, # 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码 'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默认缓存控制的最大期限 'TRAP_BAD_REQUEST_ERRORS': False, # 如果这个值被设置为 True ,Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样, # 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的。 'TRAP_HTTP_EXCEPTIONS': False, # Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是“错误的请求”异常的特殊的 key errors 。 # 同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。 # 因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。 # 如果这个值被设置为 True ,你只会得到常规的回溯。 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', # 生成URL的时候如果没有可用的 URL 模式话将使用这个值 'JSON_AS_ASCII': True, # 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False , # Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。 # 比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。 'JSON_SORT_KEYS': True, #默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。 # 这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。 # 你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。 'JSONIFY_PRETTYPRINT_REGULAR': True, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, } app.config.form_object("setting.FlaskSetting") Flask(__name__,static_url_path="/static",static_folder="stst",template_folder="templ")
九,蓝图(Blueprint)
from flask import Blueprint,render_template,redirect reg = Blueprint("reg",__name__,template_folder="reg_temp",static_folder="regs",static_url_path="/regs") @reg.route("/reg") def reg_user(): return render_template("reg_index.html") # 视图url注册 from flask import Flask import reg_user app = Flask(__name__) app.register_blueprint(reg_user.reg) if __name__ == '__main__': app.run("0.0.0.0", 9527, debug=True)
1.Flask实例配置
app.config.form_object("setting.FlaskSetting") app.DEBUG = True 开启Debug模式,该完代码不用手动重启 app.SECRET_KEY = "xxxxx" 开启session必备参数
2.初始化配置(Flask,Blueprint)
template_folder="reg_temp", static_folder="regs", static_url_path="/regs"
3.蓝图Blueprint
在app实例中注册蓝图app.register_blueprint(reg_user.reg) 实例化蓝图对象reg = Blueprint("reg",__name__,template_folder="reg_temp",static_folder="regs",static_url_path="/regs") 蓝图对象同样与Flask对象,具备独立模板和静态目录
4.before_request after_request before_frist_request
before_request 在请求进入视图函数之前做出的处理,比如methods的请求方式
after_request 在视图函数返回给用户之前做出的处理,
before_frist_request 在第一次请求进入视图函数之前做出的处理
5.errorheadler(404)
def error_page(error_massage) 定制错误信息头
6,flash 闪现