一、web框架的对比

  首先我们先来看下比较火的web框架

  1.Django:

  优点:大而全,所有组件都是组织内部开发高度定制化,教科书级别的框架

  缺点:大到浪费资源,请求的时候需要的资源较高

  2.Flask:

  优势:小而精,组件只有session,第三方机构强烈支持Flask,非常多的三方组件,简单至极

  缺陷:由于三方组件的关系,稳定性相对较差  Flask-session

  3.Sanic

  优势:异步IO非阻塞,原生WebSocket,小而精,组件只有Session,第三方机构强烈支持非常多的三方组件

  缺陷:复杂度太高

  扩展:

  QPS = 请求每秒钟的次数

  时间片:CPU工作一次的时间单位

二、Flask的安装与启动

  1.首先是安装Flask,在python中直接输入安装代码即可

pip install Flask

  

  2.启动Flask

  三行启动Flask

from flask import Flask
app = Flask(__name__)
app.run()

  

  六行代码启动Flask在前端输出Hello Flask

from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello Flask"
app.run() ##############
其中@app.route("/")是这是当前访问路径,设置访问路径有两种方式这是第一种 def index()是视图函数

三、关于Flask响应

1.Response三贱客:

    1.return HTTPResponse  对应的Flask是  return "Hello"
    2.return render       对应的Flask是  return render_template("index.html")
    3.return redircet      对应的Flask是  return redircet("/index")
    4.return send_file("文件路径")
    打开并返回文件内容,会在响应头中加入Content-Type:文件格式+Content-Length:文件大小(bytes类型)
    5.return jsonify({key:value})
    返回一个客户端可以识别的json格式字符串 会在响应头中加入Content-Type:application/json

四、关于Flask的请求

  比较特殊,首先导入request,其中request是公共变量

from flask import request

  

  如何从request中获取我们需要的数据

1.request.args    获取URL中的数据

2.request.form    获取FormData中的数据

3.request.values    获取args+form

4.request.data        字节流,获取请求体中的原始数据

5.request.json          字典请求体中带有Content-Type:application/json将请求体中的数据
反序列化到json中,但是在data中依然存储着原始数据bytes 6.request.files 获取FormData中的文件数据 request.files.get("文件") 7.request.files.save 保存文件(默认提交的文件名) 8.request.method 获取当前的请求方式

五、了解了这么多,是不是该写个前端试下了。Flask中默认的模板语言是jinja2

  1.先来看下jinja2的模板渲染所使用的for

{% for foo in list %}
{% endfor %}

  2.jinja2模板语言中的if

{% if 判断语句%}

{% elif 判断语句%}

{% else %}

{% endif %}

  接下来我们把一些数据在前端生成表格

  准备数据

STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'},

STUDENT_LIST = [
{'name': 'Old', 'age': 38, 'gender': '中'},
{'name': 'Boy', 'age': 73, 'gender': '男'},
{'name': 'NB', 'age': 84, 'gender': '女'}
] STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'NB', 'age': 84, 'gender': '女'},
}

  1.使用STUDENT字典传递至前端

  后端

@app.route("/student")
def index():
return render_template("student.html", student=STUDENT)

  前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div>{{ student }}</div>
<table border="1px">
<tr>
<td>{{ student.name }}</td>
<td>{{ student["age"] }}</td>
<td>{{ student.get("gender") }}</td>
</tr>
</table>
</body>
</html>

  2.STUDENT_LIST列表传入前端jinja2模板的操作

  后端

@app.route("/student_list")
def student_list():
return render_template("student_list.html", student=STUDENT_LIST)

  

  前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<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>

  如果需要循环遍历的话,jinja2给我们的方案是

{% for foo in student %}
<tr>
<td>{{ foo }}</td>
</tr>
{% endfor %}

上述代码中的foo就是列表中的每个字典,再用各种取值方式取出值即可

  3.STUDENT_DICT字典传入前端jinja2模板

  后端

@app.route("/student_dict")
def student_dict():
return render_template("student_dict.html", student=STUDENT_DICT)

  

  前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<table>
{% for foo in student %}
<tr>
<td>{{ foo }}</td>
<td>{{ student.get(foo).name }}</td>
<td>{{ student[foo].get("age") }}</td>
<td>{{ student[foo]["gender"] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

在遍历字典的时候,foo其实是相当于拿出了字典中的key

  4.结合所有的字符串全部传递到前端jinja2模板中去

  后端

@app.route("/allstudent")
def all_student():
return render_template("all_student.html", student=STUDENT ,
student_list = STUDENT_LIST,
student_dict= STUDENT_DICT)

  

  前端

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

这里可以看出来,render_template中可以传递多个关键字

  5.jinja2模板语言中的宏定义

  前端代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h1>jinja2模板语言中的宏定义</h1> {% macro type_text(name,type) %}
<input type="{{ type }}" name="{{ name }}" value="{{ name }}">
{% endmacro %} <h2>在下方是使用宏来生成input标签</h2> {{ type_text("one","text") }}
{{ type_text("two","text") }} </body>
</html>

但是一般很少应用的到

六、Flask中内置的Session

  Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用也很奇怪

  1.Flask中session是需要secret_key的

from flask import session
app = Flask(__name__)
app.secret_key = "DragonFire"

  secret_key实际上是用来加密字符串的,如果在实例化的app中没有secret_key那么开启session一定会抛出异常

  2.session的正确食用方法,哈哈哈

  

@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]:
session["user"] = USER["username"]
return redirect("/student_list")
return render_template("login.html", msg="用户名密码错误") return render_template("login.html", msg=None) # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg

session["user"] = USER["username"]这样用就代表这个请求带上来的session中保存了一个user = name如果想要验证session的话,就用这种方法吧

3.cookies种的session是什么

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

4.怎么用session进行验证

@app.route("/student_list")
def student():
if session.get("user"):
return render_template("student_list.html", student=STUDENT_DICT) return redirect("/login")

初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session的更多相关文章

  1. Flask中的模板语言jinja2

    jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...

  2. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  3. 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  4. 3,Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 S ...

  5. Flask中的模板语法jinjia2

    Flask中默认的模板语言是Jinja2 I. Jinja2模板语言中的 for {% for foo in g %} {% endfor %} II. Jinja2模板语言中的 if {% if g ...

  6. Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  7. Flask 中内置的 Session

    Flask中的Session Flask中的Session不同于Django的session,django的session存在后端数据库中,而flask的session会将你的SessionID存放在 ...

  8. Flask最强攻略 - 跟DragonFire学Flask - 第六篇 Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  9. 第六篇 Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

随机推荐

  1. .net手动编写Windows服务

    1,打开VS,新建一个windows服务程序.项目名称自定义,我这里用的默认名称:Service1 2,打开Service1,按F7查看代码.代码里有三个方法:public Service1().pr ...

  2. Java程序设计8——抽象类、接口与内部类

    1 抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体.但在某些情况下,某个父类并不需要实现,因为它只需要当做一个模板,而具体的实现,可以由 ...

  3. 已经安装Silverlight新版本,无法安装。

    已经安装Silverlight新版本,无法安装.该如何解决? 网上说得很乱,不管他们怎么说,还是没说清楚如何删除这个runtime!! 反正打开>控制面板>添加删除程序>找到Sliv ...

  4. WEB开发常见错误-php无法操作数据库

    Ubuntu 安装phpmyadmin 和配置   ubuntu 安装 phpmyadmin  两种 : 1: apt-get 安装  然后使用 已有的虚拟主机目录建立软连接  sudo  apt-g ...

  5. 在MS Test中如何测试private方法

    前言: 在博客开始之前,我们先讨论一下是否应该对private方法做测试,通常有两种观点: private方法应该被测试: private方法不应该被测试: 我们以下面的代码为例子来进行说明: pub ...

  6. Linux 基础教程 26-基础网络配置

    基本配置     要想上网,计算机需要有专门的网络连接设备,即网络接口卡或者网卡.网卡按照与计算机主机的连接方式可以分为PCI网卡.ISA网卡及无线网卡(USB网卡)等.在Linux中可以使用命令ls ...

  7. solrconfig.xml配置详解

    solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置. 可以在tomcat的安装路径下找到这个文件C:\Program File ...

  8. 大坑记录 - shell脚本删除操作

    背景 jenkins执行去执行shell命令,其中引用了一些jenkins的变量,如${WORKSPACE}这种,因为每次执行jenkins比较慢,于是想复制脚本出来想本地调试一下,直接复制了脚本过来 ...

  9. c#中sealed修饰符

    sealed 修饰符表示密封 用法: 1.用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 2.用于方法和属性时,表示该方法或属性不能再被重写,必须和o ...

  10. C#之通过图片地址下载图片

    因为项目上需要加载在线卫星云图,因此写了这个功能来把卫星云图下载的本地,在这里记录一下: string imageUrl=“http://image.nmc.cn/product/2018/08/06 ...