欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask框架 请求与响应 & 模板语法

程序员文章站 2022-06-29 14:11:06
Flask框架 请求与响应 & 模板语法 [TOC] 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) return "字符" render_template("HTML文件") redirect("/hom ......

flask框架 请求与响应 & 模板语法

简单了解flask框架

    flask是一个轻量级的可定制框架,使用python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。
它可以很好地结合mvc模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或web服务的实现。
另外,flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,
其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。 

#安装flask 
- pip3 install flask - 1.1.1

flask库文件(安装flask时自动安装)
    - jinja2 模板渲染库
    - markupsafe 返回安全标签 只要flask 返回模板或者标签时都会依赖markupsafe
    - werkzeug 德文“工具” == uwsgi 底层是 wsgi flask项目启动都是基于werkzeug

Flask框架 请求与响应 & 模板语法

flask 框架 与 django 框架对比

django 框架
- 原生组件非常丰富       教科书式框架
- django.model - orm    面向对象操作数据库
- django.form           form组件
- django.modelform      modelform
- django.session model  session
- admin csrftoken       跨站请求伪造 

django框架(缺点) 加载项巨大 资源浪费
django框架 适合大型,密集型项目

flask web框架 - 
flask 非常短小精悍 - 精简到只有一个 session
flask 第三方组件 非常全

flask框架(缺点) 第三方组件 - 运行稳定性相对较差
flask框架 适合小型,api服务类项目       

简单使用flask提供服务

# 三行启动flask 提供服务
from flask import flask
app = flask(__name__)
app.run()
#访问一下看看效果

Flask框架 请求与响应 & 模板语法

# 启动flask 提供服务,访问返回页面,"helloworld"
from flask import flask  # 导入flask 类创建flask应用对象
app = flask(__name__)  # app = application

@app.route("/index")  # 为 flask 应用对象增加路由
def index():  # 与路由绑定的视图函数 视图函数名尽可能保持唯一 
    return "helloworld"  # “” 相当于 django 中的 httpresponse

if __name__ == '__main__':  # 当前文件处于脚本状态时运行如下代码
    app.run()  # 启动flask 应用
    
#访问一下看看效果    

Flask框架 请求与响应 & 模板语法

flask 中的 response(响应)

return "字符"

@app.route("/index")  
def index(): 
    return "helloworld"  # "helloworld" 相当于 django中的httpresponse返回响应 (效果如上图)

render_template("html文件")

Flask框架 请求与响应 & 模板语法

#html代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>郭楷丰</title>
</head>
<body>
<h1>你好</h1>
</body>
</html>

#python代码 
from flask import flask, render_template

app = flask(__name__)

@app.route("/home")
def home():
    return render_template("home.html")  # 模板存放路径 templates

if __name__ == '__main__':
    app.run()
#访问一下看看效果   

Flask框架 请求与响应 & 模板语法

redirect("/home") 重定向

from flask import flask, render_template, redirect

app = flask(__name__)

@app.route("/home")
def home():
    return render_template("home.html")  

@app.route("/re")
def re():
    return redirect("/home")  #重定向到home

if __name__ == '__main__':
    app.run()
#访问一下看看效果      

Flask框架 请求与响应 & 模板语法

Flask框架 请求与响应 & 模板语法

    小结:
    # 3xx http status 
    # 4xx 错误 客户端
    # 5xx 错误 服务器
    redirect("/home") 其实就是在responseheaders 中加入了一个 location:http://127.0.0.1:5000/home     

send_file("文件路径") 返回文件

#返回图片示例  代码
#先准备一张图片 1.jpg
from flask import flask,send_file

app = flask(__name__)

@app.route("/get_file")
def get_file():
    return send_file("1.jpg")

if __name__ == '__main__':
    app.run()    
    
#访问一下试试看

Flask框架 请求与响应 & 模板语法

小结:
# 打开并返回文件内容 自动识别文件类型 在responseheaders中加入
# content-type:文件类型 - *文件类型 是可以被客户端识别的文件类型(如mp4,mp3,文本,图片等)
# 不能识别的类型 下载处理 - 浏览器会下载

jsonify("字符串或数据类型")

from flask import flask, jsonify

app = flask(__name__)

@app.route("/get_json")
def get_json():
    d = {
        "name": "gkf"
    }
    return jsonify(d) 

if __name__ == '__main__':
    app.run()

#访问一下试试看    

Flask框架 请求与响应 & 模板语法

小结:
jsonify("字符串或数据类型")  返回标准格式的json字符串
# content-type:application/json == 标准格式
# flask 1.1.1 目前版本 支持return d 使用
# return d  # 暂时不建议使用 兼容性差
# 直接返回dict时 本质上在执行jsonify(d)

jsonify()做了那些事
# 1.打包json 序列化json字符串
# 2.编写responseheaders 加入 content-type:application/json

应用场景:
# api 接口 ajax.post({username:123}){function(data){ obj = data }}

flask 中的 request(请求)

request.method(请求类型)

#可以判断客户端的请求来做一些操作
@app.route("/index")
def index():
    print(request.method)  
    if request.method == 'get': #如果是get请求,返回一个index.html文件
        return render_template("index.html")

Flask框架 请求与响应 & 模板语法

request.form (获取form提交数据)

#html代码
<form action="" method="post" enctype="multipart/form-data">
  <p>username: <input type="text" name="username"></p>
  <p><input type="file" name="my_file"></p>
  <input type="submit" value="登录">
</form>
#python代码
def login():
    if request.method == 'get':
        return render_template('login.html')

    if request.method == 'post':
        print(request.form.get("username")) #直接获取到username对应的值
        return redirect("/index")

Flask框架 请求与响应 & 模板语法

request.args (获取url中的数据)

#代码
@app.route("/index")
def index():
    if request.method == 'get':
        print(request.args) #request.args.get('键') 来取值
        return render_template("index.html")

Flask框架 请求与响应 & 模板语法

request.url (请求地址)

@app.route("/index")
def index():
    if request.method == 'get':
        print(request.url)
        return render_template("index.html")
#当页面输入 http://127.0.0.1:5000/index 打印结果
http://127.0.0.1:5000/index  
#当页面输入 http://127.0.0.1:5000/index?郭楷丰=318 打印结果
http://127.0.0.1:5000/index?郭楷丰=318

request.url_charset (url 编码方式)

@app.route("/index")
def index():
    if request.method == 'get':
        print(request.url_charset)
        return render_template("index.html")
    
#打印结果
utf-8

request.url_root (完整请求地址)

# print(request.url_root) # 请求地址 完整请求地址 host

@app.route("/index")
def index():
    if request.method == 'get':
        print(request.url_root)
        return render_template("index.html")
        
#访问http://127.0.0.1:5000/index 打印结果
http://127.0.0.1:5000/

request.url_rule (请求路由地址)

 print(request.url_rule) # 请求路由地址(参数不会获取)
 
 #访问http://127.0.0.1:5000/index 打印结果
 /index

request.values (接收所有请求中的数据)

#接收所有(get,post)请求中的数据,包含了 url 和 formdata 中的数据  
#一般不使用这个 因为url中的参数和form表的的参数它都会获取,如果key值重名,会报错

print(request.values)
#访问http://127.0.0.1:5000/index?郭楷丰=318  打印结果
combinedmultidict([immutablemultidict([('郭楷丰', '318')]), immutablemultidict([])])

#to_dict 转为字典形式
print(request.values.to_dict()) 
#访问http://127.0.0.1:5000/index?郭楷丰=318  打印结果
{'郭楷丰': '318'}

request.files (获取页面提交的文件)

@app.route("/login",methods=["get","post"]) #重新methods让它只接受"get","post"请求
def login():
    if request.method == 'get':
        return render_template('login.html')

    if request.method == 'post':
        print(request.files)  
        print(request.files.get("my_file"))
        return redirect("/index")  

#访问http://127.0.0.1:5000/login  并提交一个文件 执行结果
immutablemultidict([('my_file', <filestorage: '1_副本.png' ('image/png')>)]) 
<filestorage: '1_副本.png' ('image/png')>  #获取文件名字

request.files (保存文件示例)

#upload.html文件代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>文件上传演示</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
  <p><input type="file" name="my_file"></p>
  <input type="submit" value="上传图片">
</form>
</body>
</html>

#python代码
import os
from flask import flask, request, render_template

app = flask(__name__)
app.secret_key = "!@#$%^&*()" #密钥(对session进行加密)
app.debug = true #开启debug模式 修改代码自动重启项目

@app.route("/upload",methods=["get","post"])#重写methods只接收get与post请求
def upload():
    if request.method == 'get':
        return render_template('upload.html')

    if request.method == 'post':
        dir_name = './美女图片'
        if not os.path.exists(dir_name):
            os.mkdir(dir_name)
        my_file = request.files.get("my_file")
        new_file = os.path.join(dir_name, my_file.filename)
        my_file.save(new_file)
        return "上传文件成功"

if __name__ == '__main__':
    app.run()

Flask框架 请求与响应 & 模板语法

Flask框架 请求与响应 & 模板语法

request (获取其他数据)

# 获取其他数据
# request.headers 请求头中的信息
# request.cookies 请求中cookies的信息
# request.path == request.url_rule  路由地址
# request.host == "127.0.0.1:9527" 获取访问主机地址
# request.host_url == "http://127.0.0.1:9527/" 路由地址

# 特殊提交方式数据获取
# request.json 获取content-type:application/json时提交的数据
# content-type:application/json
# request.data 获取 原始请求体中的数据 b""类型
# content-type 无法被识别 或 不包含form字眼

flask 模板语言简单使用

#python代码
from flask import flask, render_template

#传给模板的数据
student = {'name': 'old', 'age': 38, 'gender': '中'} 
student_list = [
    {'name': 'old', 'age': 38, 'gender': '中'},
    {'name': 'boy', 'age': 73, 'gender': '男'},
    {'name': 'edu', 'age': 84, 'gender': '女'}
]
student_dict = {
    1: {'name': 'old', 'age': 38, 'gender': '中'},
    2: {'name': 'boy', 'age': 73, 'gender': '男'},
    3: {'name': 'edu', 'age': 84, 'gender': '女'},
}

app = flask(__name__)
app.debug = true

@app.template_global()
def ab(a, b):
    return a + b

@app.route("/stu")
def stu():
    return render_template("stuinfo.html", stu_info=student, stu_list=student_list, stu_dict=student_dict)

if __name__ == '__main__':
    app.run()
<!--stuinfo.html模板代码-->
<!doctype html>
<html lang="zh-cn">
<head>
  <title>学生信息</title>
  <style type='text/css'>
  p{
  background-color:#00ffaa;
  }
  </style>
</head>
<body>
{{ stu_info }}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
<table border="1px">
  <tr>
    <td>name</td>
    <td>age</td>
    <td>gender</td>
  </tr>
  <tr>
    <td>{{ stu_info.name }}</td>
    <td>{{ stu_info.get("age") }}</td>
    <td>{{ stu_info["gender"] }}</td>
  </tr>
</table>
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{{ stu_list }}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
<table border="1px">
  <tr>
    <td>name</td>
    <td>age</td>
    <td>gender</td>
  </tr>
  {% for stu in stu_list %}
    <tr>
      <td>{{ stu.name }}</td>
      <td>{{ stu.get("age") }}</td>
      <td>
        {% if  stu["gender"] != "男" and stu["gender"] != "女" %}
          李杰
        {% else %}
          {{ stu["gender"] }}
        {% endif %}
      </td>
    </tr>
  {% endfor %}
</table>
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{{ stu_dict }}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{% for foo in stu_dict %}
  {{ stu_dict[foo].get("name") }}
  {{ stu_dict[foo]["age"] }}
  {{ stu_dict[foo].gender }}
{% endfor %}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{% for foo,item in stu_dict.items() %}
  {{ foo }}
  {{ item.name }}
{% endfor %}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{{ ab(666,2) }}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
{% macro my_input(ty,na) %}
  请输入用户名 -> <input type="{{ ty }}" name="{{ na }}">
{% endmacro %}
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
<p>这就是我自己创造的input标签:{{ my_input("text","username") }} {{ my_input("password","pass") }} {{ my_input("file","myfile") }}</p>
<p>- - - - - - - -✂ - - - - - - - - - - - -分割线- - - - - - - - - - - -✂- - - - - - - -</p>
</body>
</html>

Flask框架 请求与响应 & 模板语法

Flask框架 请求与响应 & 模板语法

Flask框架 请求与响应 & 模板语法

Flask框架 请求与响应 & 模板语法

flask框架参考手册

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2ky0wzouug4kk

作 者:
出 处:
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是博主的最大动力!
自 勉:生活,需要追求;梦想,需要坚持;生命,需要珍惜;但人生的路上,更需要坚强。带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。