Python Flask学习知识点(一)
在此记录Python Flask学习过程中的知识点,易忘记点,中间也会记录一些小的Python技巧及知识。
本文章根据慕课网七月老师的Python Flask高级编程课程,梳理课程中的知识点,供大家参考。
MVC模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
"C"在其他语言中叫控制器,在flask中叫做视图函数
基于类的视图,在flask中又名即插视图
简单的flask demo,新建文件demo.py
import json from flask import Flask app = Flask(__name__) @app.route("/hello/") def hello(): return "hello" if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=81)
运行demo.py , 在浏览器中键入地址127.0.0.1:81/hello,可看到结果输出hello
上图代码中,定义了一个视图函数hello,并且在app.run设置为调试模式(debug)。
细心的同学可发现在试图函数上方的路由注册中明明是前后都有反斜杠@app.route("/hello/")
,可为什么在浏览器输入127.0.0.1:81/hello
不加后边的反斜杠就可以呢,是因为flask实质是把不带斜杠的url重定向到带斜杠的url上。
为什么flask要这么做?
唯一url原理便于SEO(搜索引擎优化),这里不讲SEO是什么,给出链接可自己查询
Flask配置文件
在开发环境中,在生产线上的代码是绝对不允许使用debug模式的,而上图中的代码把debug硬编码在代码中,这种方法极其不合适,正确的做法应该写在配置文件中,这样我们只需要更改配置文件即可,不用改动代码。
新建文件config.py
DEBUG = True
更改demo.py文件
import json from flask import Flask app = Flask(__name__) # 把自定义的config.py配置文件合并到flask配置文件中 app.config.from_object("config") @app.route("/hello/") def hello(): return "hello" if __name__ == "__main__": app.run(host="0.0.0.0", debug=app.config['DEBUG'], port=81)
flask配置文件中的变量要求全部大写,例如DEBUG = True
。
Flask路由注册
在Flask中有两种路由注册的方法,
@app.route("/hello/")
app.add_url_rule("/hello/", view_func=hello)
第一种是最为便捷的,采用python语言的装饰器来做路由注册,直接给视图函数增加装饰器即可。
第二种也可以达到路由注册的目的,view_func参数指定视图函数。
其实两种方式本质上都是通过app.add_url_rule("/hello/", view_func=hello)
这种方式实现的,只不过第一种方法在装饰器内部Flask自己调用了app.add_url_rule("/hello/", view_func=hello)
,可查看app.py源码:
if name == "main"在Flask的含义
相信大家都知道if __name__ == "__main__"
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if name == 'main': 的作用就是控制这两种情况执行代码的过程,在if name == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
在Flask中,一般生产环境使用 nginx+uwsgi 作为 flask 自带的web服务器,使用if __name__ == "__main__"
判断,避免在生产环境中启动flask自带的web服务器。
视图函数的返回值
通常Flask视图函数返回的都是response对象,
使用Flask的make_response方法制造response对象,
from flask import Flask, make_response @app.route("/hello/") def hello(): headers = { "content-type": "text/plain" } response = make_response("<html></html>", 200) response.headers = headers return response
但是,
通常不需要上边make_response,直接:
@app.route("/hello/") def hello(): headers = { "content-type": "text/plain" } return "<html></html>", 200, headers
上边代码表示返回三个值,分别是一个<html></html>字符转,200状态码,和header
在python中如果return 多个值 视为返回一个元组,Flask会默认调用make_response来转换,本质还是通过make_response。
这里我们设置的200状态码和返回的内容无关,只是一个标识
另外,
web (视图函数)返回的本质都是字符串,通过content-type来控制返回的字符串转换为需要值,例如:
"contentType":"application/json" (转换为json返回)
"contentType": "text/plain" (转换为文本返回)
"contentType": "text/html" (转换为html返回)
以上内容如果对大家有帮助记得点个赞哦。感谢
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
对比分析HashMap,HashTable,ConcurrentHashMap,LinkedHashMap,LURLinkedHashMap...
前言: 这次写几篇 关于 HashMap,HashTable,ConcurrentHashMap,LinkedHashMap,LURLinkedHashMap 源码分析。 如果直接将他们源码,并不好理解,所以这里我会围绕着HashMap,用对比的方式进行介绍。 由于不同的jdk版本,都对他们做了不同的优化,我这边的jdk版本 jdk1.7.0_79 jdk1.8.0_40 -- 因为1.8里面HashMap做了很大的优化 一、首先聊聊 HashMap 和 HashTable 1、出生时间: 以下内容来自java.util.HashTable源码注释 @since JDK1.0 以下内容来自java.util.HashMap源码注释 @since 1.2 可以看出,HashTable比HashMap要早一点出来(老一些)。 2、作者: 以下内容来自java.util.HashTable源码注释 * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter 以下内容来自java.util.HashMap源码注释 *...
- 下一篇
python-进程之间通信、多线程介绍
一、进程之间通信 进程的任务有三种状态:运行,就绪,阻塞。 加锁可以让多个进程修改同一块数据时,同一时间只能由一个任务可以进行修改,即串行的修改。牺牲了速度,保证了数据安全。 虽然可以使用文件共享数据实现进程间的通信,但是效率太低,还需要自己加锁处理。为了解决这些问题,便使用到了multiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道 1.队列和管道都是将数据存放于内存中 2.队列是基于管道+锁的机制实现的。 我们应该尽量避免使用共享数据,多使用队列。 队列: 创建队列的类: Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。 maxsize是队列中允许的最大项数,省略则无大小限制 q = Queue() q.put() 括号里可以是任意类型,不能是大数据 主要方法: 1 q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7