第七十七篇 Flask初识 Response,Request,Jinja2,Session

心得:学完django和rest-framework之后,再来学习flask框架,感觉似曾相识,很多类似的地方,加油,加油~

一、介绍

Django web:
优点:大而全,ORM models ,model Form ,admin ,csrf ,session
缺点:资源浪费

Flask web:
优点:小而精,ORM:x , Form:x , admin:x,csrf:x,session:√,第三方组件 : 全
缺陷:稳定性较差

Tornado:
优点:异步IO非阻塞 原生websocket
缺点:啥都没有

Sanic Web:
优点:速度极快
async def index():

第一个flask示例:

__name__在自身文件中的含义为当前文件返回的是main;当其他文件调用时,__name__表示的是调用文件名返回的是test

from flask import Flask
app = Flask(__name__) #实例化app

@app.route("/",methods=["GET","POST"]) #设置路由
def index():
	return "Hello World"  #返回结果

app.run() #运行

二、Reseponse的五种方式

1. 返回字符串

Django中HTTPResponse对应:return “先帝创业未半而中道崩殂”

@app.route("/",methods=["GET","POST"]) #设置路由
def index():
	return "Hello World"  #返回结果

2. 返回模板

render: return render_template(“login.html”)
创建模板文件夹templates,将模板文件放入文件夹内

from flask import Flask, render_template
@app.route("/index2")
def index2():
    return render_template("index2.html")

3. 重定向和反向解析

重定向:

redirect:return redirect("/login")

from flask import Flask, render_template, redirect,url_for
@app.route("/")
def index1():
    return redirect("/index2")

反向解析:
endpoint作用:
1 将名字复杂的函数名利用endpoint简单命名
2 url_for反向访问地址时,是动态获取路由

from flask import Flask, render_template, redirect,url_for
@app.route("/")
def index1():
    return redirect(url_for('index2'))

@app.route("/index2",endpoint="index2")
def index2():
    return render_template("index2.html")

4.发送文件

将文件发送到网页端,并生成对应的url路由
return send_file() : return send_file(“1.jpg”) 打开并传输文件

from flask import Flask, send_file
@app.route("/img/<filename>")
def img(filename):
    return send_file("static/%s"%filename)

在这里插入图片描述

5. 发送Json数据

Content-Type 是 application/json , 这样做是符合 HTTP 协议的规定的,并且减小数据量
return jsonify() : return jsonify({“name”:“JWB”,“age”:73}) Content-Type: application/json

使用jsonify返回数据

##  jsonify
import json
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/json')
def test_json():
    data = {'name': 'lilei', 'age': 30}
    return jsonify(data)

app.run(host="0.0.0.0", port=9877)

输出为:

Content-Type: application/json
{"age":30,"name":"lilei"}

使用json.dump返回数据

## json
import json
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/json')
def test_json():
    data = {'name': 'lilei', 'age': 30}
    return json.dumps(data)

app.run(host="0.0.0.0", port=9877)

输出:

Content-Type: text/html; charset=utf-8
{"name": "lilei", "age": 30}

三、Flask中的request

from flask import request
request.method 请求方式
request.form 存储的是所有FormData中的所有数据
request.args 存储的是所有URL中的所有数据
request.json Content-Type: application/json 存放在request.json中
request.data 当Content-Type无法被解析时,存放原始数据
request.url 请求地址
request.path url路由地址
request.host 主机地址
request.host_url 将主机地址转换为httpurl
request.files

from flask import Flask, render_template, redirect,send_file,url_for,jsonify,request

app = Flask(__name__,static_folder="haha",static_url_path="/statics")
#static_folder   加载本地精通文件地址
#static_url_path 将本地得静态文件全部发送到网页端,类似于send_file,然后html端调用

@app.route("/")
def index1():
    return redirect(url_for('index2'))

@app.route("/index2",endpoint="index2")
def index2():
    return render_template("index2.html")

@app.route("/login",methods=['GET',"POST"])
def login():
    if request.method == "GET":
        return render_template("login.html")
    else:
        dic=request.form.to_dict()
        user=dic.get('user',0)
        pwd=dic.get('pwd',0)
        #print(request.files) #文件字典
        #f=request.files.get('f',None) #获取文件  
        #f.save(f.filename)  #存储文件在当前路径下
        if user=='tian' and pwd =="123":
            return redirect(url_for('index2'))
        else:
            return render_template("login.html",msg="账号或密码错误")

app.run(debug=True)

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <p><input type="text" name="user"></p>
    <p><input type="password" name="pwd"></p>
    <p><input type="file" name="f"></p>
    <p><input type="submit"></p>
</form>
<h1>{{ msg }}</h1>
</body>
</html>

四、Jinja2基本语法

1 基本用法

符合python用法

{{}} 引用或执行时
{%%} 逻辑代码
Jinja2模板语言中的 for

{% for foo in g %}

{% endfor %}

Jinja2模板语言中的 if

{% if g %}

{% elif g %}
    
{% else %}
    
{% endif %}

示例:

STUDENT_LIST = [
    {'name': 'Old', 'age': 38, 'gender': '中'},
    {'name': 'Boy', 'age': 73, 'gender': '男'},
    {'name': 'EDU', 'age': 84, 'gender': '女'}
]
@app.route("/student")
def index():
    return render_template("student.html", student=STUDENT_LIST )

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
<body>
Welcome to Old Boy EDU
<div>{{ student }}</div>
<table border="1xp">
    {% for foo in student %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ foo.name }}</td>
            <td>{{ foo.get("age") }}</td>
            <td>{{ foo["gender"] }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

在这里插入图片描述

2 高级用法

safe用法:

from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route("/")
def index():
    tag = "<input type='text' name='user' value='DragonFire'>"
    return render_template("index.html",tag=tag)


app.run("0.0.0.0",5000)

前端处理:

{{ tag | safe}}  <!--  加上个 \  管道符,然后 safe  -->

后端处理:

from flask import Flask
from flask import render_template
from flask import Markup  # 导入 flask 中的 Markup 模块

app = Flask(__name__)

@app.route("/")
def index():
    tag = "<input type='text' name='user' value='DragonFire'>"
    markup_tag = Markup(tag)  # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签
    return render_template("index.html", tag=markup_tag)

app.run("0.0.0.0", 5000, debug=True)

jinja2 中代码复用block

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Welcome OldboyEDU</h1>
    <h2>下面的内容是不一样的</h2>
    {% block content %}

    {% endblock %}
    <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    <h1>OldboyEDU is Good</h1>
</body>
</html>

login.html

{% extends "index.html" %}
{% block content %}
    <form>
        用户名:<input type="text" name="user">
        密码:<input type="text" name="pwd">
    </form>
{% endblock %}

app.py

from flask import Flask
from flask import render_template

app = Flask(__name__)

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

app.run("0.0.0.0", 5000, debug=True)

五.Session

Flask 中 session 是需要 secret_key 的

app.secret_key = "yinjiaodawangba"  
Flask中的session是保存在 cookie 中的

cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息

session 进行验证:

from flask import Flask, render_template, redirect,send_file,url_for,jsonify,request,session

app = Flask(__name__,static_folder="haha",static_url_path="/statics")
app.secret_key="hahaha"

@app.route("/")
def index1():
    if session.get('tian') == "tiantian":
        return redirect(url_for('index2'))
    else:
        return redirect("/login")

@app.route("/login",methods=['GET',"POST"])
def login():
    if request.method == "GET":
        return render_template("login.html")
    else:
        dic=request.form.to_dict()
        user=dic.get('user',0)
        pwd=dic.get('pwd',0)
        # print(request.files) #文件字典
        # f=request.files.get('f',None) #获取文件
        # f.save(f.filename)  #存储文件在当前路径下
        if user=='tian' and pwd =="123":
            session['tian']="tiantian"
            return redirect(url_for('index2'))
        else:
            return render_template("login.html",msg="账号或密码错误")

app.run(debug=True)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值