Flask笔记

首先明确一下,要运行一个动态网页,我们需要

  1. 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用。
  2. 一个 Web 应用来动态处理请求,生成响应

其中 Web 服务器通常都是别人已经实现好了的,它通过定义好的接口与我们编写的 Web 应用通信。WSGI 就是一个统一的 Web 服务器接口标准,如果我们按照 WSGI 编写 Web 应用,那么它就能在任何符合该标准的服务器上运行,例如 Gunicorn.(对比一下 Java 的 Servlet,按照 Servlet 规范编写的应用,都能运行在任何 Servlet 容器上,例如 Tomcat 和 Jetty,Servlet 容器就相当于 WSGI 服务器)

可是 WSGI 仍然比较底层,直接照着它写太麻烦,于是就有了 Web 框架,Python 知名的就是 Flask 和 Django。Java 的 Servlet 也是如此,对应的出现了 Spring MVC 框架。但是 Flask 和 Django 都有内置服务器用于测试,而 Spring MVC 没有,倒是 Spring Boot 可以使用内嵌的 tomcat 容器。

Flask 是一个微框架,“微”是指它的核心非常小,任何可选的功能都不包括在内。但是 Flask 社区提供了丰富的拓展插件,你可以通过选择需要的插件来实现你想要的功能。

一、简介

Flask 是一个微框架,“微”是指它的核心非常小,任何可选的功能都不包括在内。但是 Flask 社区提供了丰富的拓展插件,你可以通过选择需要的插件来实现你想要的功能。

二、demo演示

环境准备

sudo apt install python-pip
sudo pip3 install flask
mkdir flask
cd flask/

hello-world.py文件

#!/usr/bin/env python3
"""Out first Flask Application"""
from flask import Flask
app = Flask("__name__") #这里以接受包或者模块为参数,一般传递__name__
#这里定义了变量app赋值为Flask() @app.route('/') #这里相当于定义了一个路由,具体访问一下本地就知道了
def index(): #路由的函数就是紧接着定义的函数
return "Hello World!" #访问http://127.0.0.1:5000/(默认端口)界面返回Hello World! @app.route('/say_hello')
def say_hello():
return "Hello You are so Good!" #访问http://127.0.0.1:5000/say_hello界面返回Hello You are so Good! if (__name__=="__main__"):
app.run() #端口可以修改app.run(host='0.0.0.0',port=8000)

一个非常简单的flask网页就已经搭建成功,直接运行该python程序

┌─[thekingofnight@parrot]─[~/flask]
└──╼ $chmod +x hello-world.py
┌─[thekingofnight@parrot]─[~/flask]
└──╼ $sudo ./hello-world.py
* Serving Flask app "__name__" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

当然也可以这样,效果是一样的

┌─[thekingofnight@parrot]─[~/flask]
└──╼ $FLASK_APP=hello-world.py flask run
* Serving Flask app "hello-world"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

三、自定义Flask配置文件的几种方式

第一种:

app.debug=True
app.secret_key='*****' # 随便填

第二种:

app.config["DEBUG"]=True

或者

config = {
"DEBUG":True,
"SECRET_KEY":'***'
}
app.config.update(config)

第三种:指定配置文件,ps: 配置文件与运行文件要在同一路径下

app.config.from_pyfile('settings.py')

第四种:使用类当作配置文件

配置文件foo.py文件

class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config):
DEBUG = True class TestingConfig(Config):
TESTING = True
# 导入该类
# app.config.from_object('python类或类的路径')
app.config.from_object(foo.DevelopmentConfig)

四、路由

使用路由的几种方式

第一种:

from flask import Flask,request
app = Flask(__name__)
@app.route('/',methods=['GET','POST'])
def index():
print(request)
if request.method == "POST":
return "我是首页 POST"
else:
return "我是首页 GET"
if __name__ == '__main__':
app.run()

第二种:

from flask import Flask,request
app = Flask(__name__)
def index():
return "我是首页"
app.add_url_rule('/','index',index,methods=['GET','POST'])
if __name__ == '__main__':
app.run()

五、反向解析

from flask import Flask,redirect,url_for,request

app = Flask(__name__)

@app.route('/',methods=['GET','POST'],endpoint='index_plf')	# endpoint 反向路由别名
def index():
print(request)
if request.method == "POST":
return "我是首页 POST"
else:
return "我是首页 GET" @app.route('/register',methods=['GET','POST'])
def register():
print(request)
if request.method == "POST":
return "注册界面 POST"
else:
return redirect(url_for('index_plf')) # url_for从定向到指定别名为index_plf的路由视图中 if __name__ == '__main__':
app.run()

当我们使用get方式访问127.0.0.1:5000/register时,会直接跳转到index视图函数中

六、四剑客

从定向:redirect

from flask import Flask,redirect,url_for,request

app = Flask(__name__)

@app.route('/',methods=['GET','POST'],endpoint='index_plf')	# endpoint 反向路由别名
def index():
print(request)
if request.method == "POST":
return "我是首页 POST"
else:
return "我是首页 GET" @app.route('/register',methods=['GET','POST'])
def register():
print(request)
if request.method == "POST":
return "注册界面 POST"
else:
return redirect(url_for('index_plf')) # url_for从定向到指定别名为index_plf的路由视图中 if __name__ == '__main__':
app.run()

返回json数据:jsonify

from flask import Flask,jsonify
app = Flask(__name__) @app.route('/plf',methods=['GET','POST'])
def plf():
print(request)
if request.method == "POST":
return jsonify({"status":"OK","msg":"plf界面 POST"})
else:
return jsonify({"status":"OK","msg":"plf界面 GET"})
if __name__ == '__main__':
app.run() """
{
"msg": "plf\u754c\u9762 GET",
"status": "OK"
}
"""

渲染页面:render_template

from flask import Flask,render_template,request
app = Flask(__name__) @app.route('/lt',methods=['GET','POST'])
def lt():
print(request)
if request.method == "POST":
return render_template('lt.html',age=18)
else:
return render_template('lt.html',age=18)
if __name__ == '__main__':
app.run()

ps:注意模板渲染时,html文件应该放入templates文件夹中。同时必须要注意运行的文件必须要跟templates文件夹在同一个目录下

响应对象:Response

from flask import Flask,Response
app = Flask(__name__) @app.route('/plf_test',methods=['GET','POST'])
def plf_test():
print(request)
if request.method == "POST":
return Response("plf_test界面 POST")
else:
return Response("plf_test界面 GET")
if __name__ == '__main__':
app.run()

Flask笔记1的更多相关文章

  1. flask笔记(三)Flask 添加登陆验证装饰器报错,及解析

    Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...

  2. Flask笔记:RESTful

    RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...

  3. Flask笔记(一)

    first_flask_project.py # 从flask这个包中导入Flask这个类 # Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 # 注册url.注册蓝图等都是基于这个类 ...

  4. flask笔记3-模板

    flask框架使用jinja2模板引擎.简单的说,模板就是一个纯html文件中夹杂着占位符,在渲染模板时用真实变量值替换占位符,就形成了最终的前台页面. 1.模板存放位置: 默认情况下,flask在根 ...

  5. flask笔记2-程序的基本结构

    第一个flask web程序 1.初始化(所有flask程序都必须创建一个程序实例,程序实例是Flask类的对象): from flask import Flask app = Flask(__nam ...

  6. flask笔记1-安装

    1.创建应用的根目录: 2.在根目录下创建独立的虚拟python运行环境,创建完成后当前目录会有一个文件夹,即该独立环境(使用--no-site-pachages参数将不会复制任何系统python环境 ...

  7. flask笔记---url、变量规则

    1.路由: route() 装饰器用于把一个函数绑定到一个 URL,可以动态变化 URL 的某些部分,还可以为一个函数指定多个规则,从而方便用户访问与记忆. 例子: @app.route('/') # ...

  8. flask笔记二

    web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...

  9. flask笔记一

    最近学习flask,由于web开发方面接触的并不是很多,所以看官方文档有点焦头烂额,好多的概念不理解. <Flask web 开发>比较基础,先用这本书做个入门. 1.Flask实例化对象 ...

随机推荐

  1. MySQL数据库重点监控指标

    MySQL数据库重点监控指标 QPS queries per seconds 每秒中查询数量 show global status like 'Question%'; Queries/seconds ...

  2. [CCPC2019秦皇岛] F. Forest Program

    [CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林 ...

  3. Android 验证APK签名对比

    最近OTT制定产品,其中有一条需求是只能安装自己公司签名的APK,所以在网上找了相关资料,最后总结功能实现如下: 1.签名错误码frameworks/base/core/java/android/co ...

  4. Mybaits的中的对象映射(包含仅有基本数据类型的属性的和对象类型的属性的)

    转:https://blog.csdn.net/cjt20100/article/details/46547617. 1 constructor – 用来将结果反射给一个实例化好的类的构造器    a ...

  5. python3练习100题——013

    熟悉的水仙花数来了,,,... 原题链接:http://www.runoob.com/python/python-exercise-example13.html 题目:打印出所有的"水仙花数 ...

  6. MyBatis 逆向工程——根据数据表自动生成model、xml映射文件、mapper接口

    MyBatis Generator(MBG)的使用 MBG可以根据数据表生成对应的model.xml映射文件.mapper接口,只是简单的生成,还需要根据需求修改. 1.下载jar包 https:// ...

  7. PHP+jPaginate插件制作无刷新分页实例

    jPaginate是一款动感滚动分页插件,它的表现形式是像分页的按钮一样,有意思的是这些按钮却可以左右滚动,可以通过单击或 鼠标滑向点两侧的小箭头来控制按钮的左右滚动. 读取第一页数据: <di ...

  8. 详解C++11智能指针

    前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用. C++11智能指针介 ...

  9. 1032 Sharing (25分)

    1032 Sharing (25分) 题目 思路 定义map存储所有的<地址1,地址2> 第一set存放单词1的所有地址(通过查找map) 通过单词二的首地址,结合map,然后在set中查 ...

  10. Codeforces Global Round 3:B. Born This Way

    Born This Way原文链接:[传送门] 题目大意:潇洒哥想乘坐飞机从A地到达C地,但是没有直达的航班,在A地和B地之间有一个可以中转的航班B,潇洒哥想早点到达C地(有航班就坐),但是很不幸他得 ...