心得:学完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">
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<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">
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
Welcome to Old Boy EDU
<div>{{ student }}</div>
<table border="1xp">
    {% for foo in student %}
            <td>{{ foo }}</td>
            <td>{{ foo.name }}</td>
            <td>{{ foo.get("age") }}</td>
            <td>{{ foo["gender"] }}</td>
    {% 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">
    <meta charset="UTF-8">
    <title>Title</title>
</head>
    <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 %}
        用户名:<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)
                    心得:学完django和rest-framework之后,再来学习flask框架,感觉似曾相识,很多类似的地方,加油,加油~一、介绍Django web:优点:大而全,ORM models ,model Form ,admin ,csrf ,session缺点:资源浪费Flask web:优点:小而精,ORM:x , Form:x , admin:x,csrf:x,session:√,...
def hello(name):
return render_template(“hello.html”, name=name)
render_template函数第一个参数对应的是模板的文件名,后面的参数为向模板中传递的参数值。
Flask在程序文件夹中的templates子文件夹中根据模板文件名来寻找对应的模板。
所以需要在templates子文件夹下定义一个hello.html文件。
代码如下:
				
一、jinja2简单介绍 Jinja2是Python里一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。 他基于unicode并能在python2.4之后的版本运行,包括python3。 二、Django和Flask的比较 Dj...
1.Flask 安装 + 启动 from flask import Flask app = Flask(__name__) # 实例化flask对象 # __name__ 多app应用,分区实例在哪个文件中 app.run() 高级启动: from flask import Flask app = Flask(__n... response=make_response()#创建一个response response.data=json,dumps({&amp;quot;id&amp;quot;:&amp;quot;001&amp;quot;,&amp;quot;pwd&amp;quot;:&amp;quot;123456&amp;quot;})#返回数据 response.headers['uu']='test'#添加headers属
最近一前端的小伙给我说,他想让所有模板使用同一个变量,每个模板对其值做了修改,其他模板拿到的变量也得到相应的改变,说白了就是jinja2操作全局变量,这个可以使用cookie来实现,但是他不想做相应的js操作,然后问我有什么办法吗? 我考虑之后想到jinja2可以设置全局函数,可以让全局函数来操作变量,实现代码如下。目录结构如下globaltest.py#coding:utf-8 from fla
1.介绍Jinja2是python的一种模板语言,以Django的模板语言为原本,和Django的模板语言有很多相似之处,同时Jinja本身也是一种系统的、完整的Python模板语言。2.为什么需要模板语言在html中写for if或者其他流程控制语句? 在html中使用include、extend等方法复用html? …考虑到我们用Python做web开发的情况,首先我们既想后台业务逻辑的代码
1. 什么是Jinja2模板引擎 python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护; 模板渲染: 在html文件中,通过动态赋值,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。 2. 语法 2.1 Jinja2变量显示语法: {{ 变量名 }} # 完整的过滤器查看位置: http:...
Flask学习之请求钩子、cookie和sessionJinja2...请求钩子(类似于django的中间件)状态保持cookie设置和获取设置cookie获取cookie删除cookiesession的设置和获取利用系统方法创建一个secret_key设置session和跳转到获取sessionsession的过期时间 请求钩子(类似于django的中间件) before_first_re...
我们知道,Flask 使用 Jinja 2 作为模板引擎,我们也可以自由使用其它的模板引擎,但运行 Flask 本身仍然需要 Jinja2 依赖 ,这对启用富扩展是必要的,扩展可以依赖 Jinja2 存在。 我们接下来就来看下Jinja2模板引擎的默认配置: 所有扩展名为 .html 、 .htm 、 .xml 以及 .xhtml 的模板会开启自动转义 模板可以利用 {% autoescap...
from flask import render_template,render_template_string render_template return render_template('index.html') #将index.html页面的内容读取出来并进行响应
要在Flask中设置session,您需要使用Flask提供的session对象。您可以使用以下代码来创建一个session并将其存储在response中: ```python from flask import Flask, session, make_response app = Flask(__name__) app.secret_key = 'your_secret_key' @app.route('/') def index(): session['key'] = 'value' response = make_response('Session set') return response 在这个例子中,我们首先导入了Flasksession和make_response。然后我们创建了一个Flask应用,并设置了一个密钥来加密session数据。在路由函数中,我们通过session对象设置了一个键值对。最后,我们使用make_response将响应对象创建并返回给客户端。 请注意,为了使用session,您需要设置一个密钥来加密session数据。如果没有设置密钥,Flask会抛出一个错误。