python flask body_html 字符串替换_python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Ji...

一、Flask初识

首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分

三大主流Web框架对比

1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架

2.Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架

3.Flask 主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架

Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成

Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批

Flask 通常应用于小型应用和快速构建应用,其强大的三方库,足以支撑一个大型的Web应用

Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费

Tornado 优点是异步,缺点是干净,连个Session都不支持

Flask 优点是精悍简单,缺点是你不会!哈哈哈哈哈哈!

总结:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Flask:1.轻,短小精悍2.快,三行代码开启服务

缺点:1.组件大部分来源于三方,flask-admin,flask-session2.flask大版本更新,组件更新速度慢

Django:1.大而全,admin,models,Form,中间件,session2.一个框架解决所有问题

缺点:1.一旦启动,所有资源全部加载,用不到的,浪费了2.太大了,结构复杂3.所有的组件,全部由Django自身控制

Tornado:1.原生websocket2.异步io3.非阻塞

缺点:

三方及原生组件几乎为0

View Code

Flask 的安装与HelloWorld

Flask的安装特别难,但是以一个多年奋斗在程序界的我,肯定会找出一个最简单的方法教你们,具体操作如下:

pip install Flask

别问我还有没有复杂的方法,没有!

Flask安装完成了,下面使用Flask走一遍仪式:

三行Flask

from flask importFlask

app= Flask(__name__)

app.run()

执行输出:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

默认端口是5000,访问页面:

2cd8094eb121c3808aabf514600ee3d5.png

因为没有定义路由,所以报404。但是服务是起来了!

六行Flask

from flask importFlask

app= Flask(__name__)

@app.route("/")defindex():return "HelloWorld!!"app.run()

重启程序,刷新页面

f8b126cb206a499fd400a436a1860f1e.png

实现了Flask 的第一个HelloWorld程序,恭喜恭喜!

解读一下代码

from flask import Flask #导入Flask类

app = Flask(__name__) #实例化Flask对象app

@app.route("/") #app中的route装饰器

def index(): #视图函数

return "HelloWorld!!" #返回响应体

#监听地址为0.0.0.0,表示服务器的所有网卡#5000是监听端口#debug=True表示启动debug模式。当代码有改动时,Flask会自动加载,无序重启!

app.run("0.0.0.0",5000,debug=True) #启动Flask服务

注意:默认的debug模式是关闭的。如有有代码改动,需要重启flask才行生效!

但是开启debug模式,代码一有改动,会立刻加载,无需重启!

还有一点,app = Flask(__name__)。这里面的__name__表示 标识模块的名字的一个系统变量

还可以是 app= Flask("fdsafejisi"),这样运行也没有问题。那么为什么要用__name__呢?

后面学习到蓝图会用到!

启动了Flask,得到了返回值,打印在页面上

本文参考:

二、Render Redirect HttpResponse

HTTPResponse

@app.route("/") #app中的route装饰器

def index(): #视图函数

return "HelloWorld!!" #HttpResponse

在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串

Redirect

from flask import Flask #导入Flask类

from flask import redirect # 导入flask中的redirect

app= Flask(__name__)#app中的route装饰器,用来指定视图函数的URL地址

@app.route("/redi")def redi(): #视图函数

return redirect("/") # redirect跳转至"/"

@app.route("/")def index(): #视图函数

return "hello"

if __name__ == '__main__':

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

每当访问"/redi"这个地址的时候,视图函数redi会触发redirect("/") 跳转到url地址:  "/" 并会触发"/"对应的视图函数index()

访问url:  http://127.0.0.1:5000/redi

d6311e24ca7b85d2e53896b2e918f6e0.png

查看网页工具,查看网络。它经历了2次请求!

30f5d5e9e382013edb4bef32d8a16f9c.png

render (render_template)

编辑文件demo.py,代码如下

from flask import Flask #导入Flask类

from flask import render_template #导入flask中的render_template

app= Flask(__name__)

@app.route("/home")def home(): #视图函数

#渲染html模板,返回html页面

return render_template("home.html")if __name__ == '__main__':

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

在当前py文件目录中创建templates,在此目录下创建文件home.hml

Title

Flask

重启flask,访问home页面,效果如下:

2e12999e004e3aeee0f238df32ba5186.png

目录结果如下:

./├── demo.py

└── templates

└── home.html

HTML模板渲染是每个Web框架中都必须有的,至于render_template的具体用法,留个悬念,往后看

注意: 如果要使用 render_template 返回渲染的模板,请在项目的主目录中加入一个目录 templates

否则可能会有一个Jinja2的异常哦

33af0e024e9243fade37825c2774f0be.png

遇到上述的问题,基本上就是你的template的路径问题

为什么要一定要创建templates文件夹呢?叫abc,行不行呢?不行!

看这一行代码

app = Flask(__name__)

使用Ctrl+鼠标左键,点击Falsk,查看源码

def __init__(

self,

import_name,

static_url_path=None,

static_folder='static',

static_host=None,

host_matching=False,

subdomain_matching=False,

template_folder='templates',

instance_path=None,

instance_relative_config=False,

root_path=None

):

看到template_folder变量没有?文件夹必须叫这个名字!

指定templates路径

注意:我的flask程序,是直接用新建py文件写的。所以这一行代码,会飘黄

return render_template("home.html")

怎么解决呢?很简单!执行目录就好了

右键templates文件夹-->Mark Directory as-->Template Folder

3e5fa6ddb0516151c739c772aa6e2100.png

选择yes

ffd9cd76394587765eca0e5b04f17f4b.png

选择Jinja2,Flask中默认的模板语言是Jinja2

django的模板语言为django,其实django底层也是用Jinja2开发的。其他模板语言同理!

后续会讲到flaks模板语法,你会发现,和django几乎是一样的!

7634d8bd61a6ab882fde34e4470dbe62.png

注意:如果直接使用Pycharm创建Flask项目,是不存在这个问题的!

607cb7e39757b56f787eda39f7a9310b.png

前期学习Flask,要先自己手动折腾,后期就可以用Pycharm创建了!

三、request

每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的

为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互

基于HTML + Flask 写一段前后端的交互

先写一段儿HTML form表单中提交方式是post  action地址是 /req

在templates目录创建文件login.html

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Title

欢迎登陆

View Code

写好一个标准 form 表单,一点提交,搜就向后端提交一个POST请求过去了

后端的接收方式就 666 了

首先要从 flask 包中导入 request 模块 , 至于为什么要导入 request 呢? 这里不做解释,暂时你就知道 request 如果要用,需要导入

demo.py

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from flask import Flask #导入Flask类

from flask import render_template #导入flask中的render_template

from flask import request #导入flask中的request

app= Flask(__name__)

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

@app.route("/req")def home(): #视图函数

print(request)return "ok"

if __name__ == '__main__':

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

View Code

重启flask,访问登录页面

318f1c4a47655828af662358c096101d.png

提示之后,报错!提示请求方式不被允许!

20f85f35250ac123106c0c310990121f.png

methods

为什么呢?因为默认路由只允许GET访问。那么需要加一个参数methods,允许POST访问

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from flask import Flask #导入Flask类

from flask import render_template #导入flask中的render_template

from flask import request #导入flask中的request

app= Flask(__name__)

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

@app.route("/req",methods=["POST"]) #只允许POST

def home(): #视图函数

print(request) #request对象

print(request.method) #POST看来可以使用这种方式来验证请求方式

#ImmutableMultiDict([('user', 'xiao'), ('pwd', '123')])

print(request.form)#ImmutableMultiDict 它看起来像是Dict,使用字典方式取值

print(request.form["user"]) #xiao

print(request.form.get("pwd")) #123

#字典迭代器对象,keys表示获取所有值

print(request.form.keys())#既然是迭代器,就可以使用for循环了

for i inrequest.form.keys():print(i)return "ok"

if __name__ == '__main__':

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

View Code

重新提交一次,就可以了!

15068ef628e42ce8942a7982011648cb.png

查看Pycharm控制台输出:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

POST

ImmutableMultiDict([('user', 'xiao'), ('pwd', '123')])

xiao123

user

pwd

View Code

解释一个 @app.route("/req",methods=[

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值