Flask:基本结构
python有两个比较出名的网络框架,一个是django,一个是flask. 之前的django文章里面介绍了django的各种用法,这个系列开始介绍flask的用法.相比与django,flask更加简单,透明,flask没有django支持的那么多框架,比如admin等.但是也正是因为没有这么多的框架,因此flask更加适合自己DIY.下面就开始flask
1初始化:
所有flask程序都必须创建一个程序实例,web服务器使用WSGI的网关协议,把接收自客户端的所有请求都转交给这个对象处理.程序实例的创建代码如下。
首先引用Flask,然后申请程序实例,也就是Flask类的对象。并且Flask的构造函数有一个必须指定的参数,也就是程序主模块或包的名字。在这里传入的是__name__
from flask import Flask
app = Flask(__name__)
那么这个__name__到底是什么意思呢。我们平常在写python代码的时候,主文件的调用都会加上if __name__==”__main__”的语句。为什么会有这样的写法呢?我们来看一个例子,新建2个py文件,test.py,test1.py,在两个文件中分别添加代码print __name__,然后在test.py中引用test1 import test1. 此时运行test.py。
得到的结果如下
test1
__main__
那么到这里我们基本能明白__name__的作用了,在被引用的模块中,__name__是模块文件名,在调用的文件中,__name__就是运行的文件名。如果test.py中没有引用test1.py直接运行test.py那么__name__就既是模块文件名也是运行的文件名。两者是相同的。
介绍到这那么就明白__name__的作用了,它指定了程序的主模块或包的名字
2 路由和视图函数
客户端把请求发送给web服务器,web服务器再把请求发送给Flask程序实例,这样程序实例就知道了对每个URL请求应该运行那些代码。这也就是路由。在django中通过url(r'^index/',views.index)将URL地址和后端的views关联起来。那么来看下Flask是如何指定路由的呢。Flask中是通过app.route修饰器来将装饰的函数注册为路由。hello_world为处理程序。@app.route('/')的意思就是如果服务器的域名是www.example.com,那么如果在浏览器中访问www.example.com,那么出触发服务器执行hello_world函数。
@app.route('/')
def hello_world():
return 'Hello World!'
3 启动服务器
既然实例已经初始化而且路由也指定好了。那么现在就应该启动服务器来运行了。通过app.run()来实际运行
if __name__ == '__main__':
app.run()
运行后出现如下的打印。可以看到域名以及端口。
/usr/bin/python2.7 /home/zhf/py_prj/flask_prj/flask_prj.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在浏览器中执行http://127.0.0.1:5000/后,浏览器会打印Hello World!.
在这个实例中,host地址是127.0.0.1, 默认端口是5000,这个启动的是本地服务器。如果我们想部署自己的IP和端口的话该如何实现呢,如下所示,通过指定host和端口的值就可以改变服务器地址和端口了。
if __name__ == '__main__':
app.run(host='192.168.0.12',port=8000)
4 请求函数以及响应
在浏览器中经常会传递参数,在django中通过在处理函数中传入request参数来获取。Flask中也是大同小异。
from flask import request
@app.route('/')
def hello_world():
user_agent=request.headers.get('User-Agent')
return user_agent
上面的代码中通过return user_agent将数据返回到浏览器上。返回的时候还还可以返回HTML的形式。比如return ‘<h1>user_agent</h1>’. 也可以返回这种形式return ‘<h1>bad request</h1>’,400. 这里返回一个400状态码表示请求无效。
如果不想返回由1个,2个或多个组成的元组。 Flask视图函数可以返回response对象,make_response函数接收1个,2个或3个参数。并返回一个response对象。通过这个response对象,我们可以在上面调用各种方法,进一步设置响应,比如设置cookie
运行后浏览器中显示
This document carries a cookie!
在浏览器中可以看到设置的cookie值

5 Flask扩展
Flask的开发web服务器支持很多启动设置选项。但只能在脚本中作为参数传给app.run()。但这种方式并不方便。传递设置选项的理想方式使用命令行参数。Flask-Script是一个Flask扩展。为Flask程序添加了一个命令行解析器。代码修改如下:
from flask import Flask
from flask import request
from flask import make_response
from flask_script import Manager
app = Flask(__name__)
if __name__ == '__main__':
manager=Manager(app)
manager.run()
这样修改后,程序可以使用一组基本命令行选项,现在运行flask_prj.py,会显示一个用法消息。

runserver命令用来启动web服务器,运行python flask_prj.py runserver将启动服务器,而--help参数将显示如何传递参数

通过这种方式就可以在命令行中指定地址和端口了
zhf@zhf-maple:~/py_prj/flask_prj$ python flask_prj.py runserver --host 127.0.0 --port 8000
* Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
Flask:基本结构的更多相关文章
- 一个比较良好的flask项目结构
一个比较良好的flask项目结构 project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ ...
- Flask - 特殊装饰器 和 Flask工作结构模式(FBV, CBV)
目录 Flask - 特殊装饰器 和 Flask工作结构模式 @app.errorhandler() @app.before_request @app.after_request FBV和CBV Fl ...
- flask 程序结构概括
以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...
- flask模板结构组织(局部模板、宏、模板继承)
模板结构组织 除了使用函数.过滤器等工具控制模板的输出外,jinja2还提供了一些工具来在宏观上组织模板内容. 局部模板 在Web程序中,我们通常会为每一类页面编写一个独立的模板.比如主页模板.用户资 ...
- flask项目结构(四)使用sqlalchemy和alembic
简介 其实我不是啥正经人,错了,不是啥正经程序员,所能想到的估计也就码农一级吧,高级程序员,搞什么算法,什么人工智能,大数据计算…………离我还太遥远. 但是这并不妨碍我继续学习,继续写垃圾小程序. 反 ...
- flask项目结构(三)使用蓝图
简介: Flask中的蓝图旨在针对这些情况: 把一个应用分解成一系列的蓝图.对于大型的应用是理想化的:一个项目能实例化一个应用, 初始化一些扩展,以及注册一系列的蓝图. 以一个 URL 前缀和/或子域 ...
- python flask 项目结构
1. 今天学习遇到一个问题,以前项目比较简单,所有的@app.route 都是写在一个文件app.py 中的,然后启动也是在这个文件中启动app.run .但是我今天 想写一个新的模块, 于是我新启了 ...
- flask项目结构(六)快速开发后台flask-admin
简介: Flask-admin 相当django的xadmin吧! 快速装配一个后台用来管理数据. Flask-admin也是有使用局限性的,他只适合开发小型快速的应用,不适合那种大型并发性高,逻辑复 ...
- flask项目结构(五)使用数据库
简介: 基础搭建好了,开始读写数据库吧.毕竟写的程序,也没什么高深的,就是CRUD,中文说是增删改查. 一:在数据库中增加测试数据. 在项目根目录建立init_test.py from config ...
- flask项目结构(二)创建flask,同步docker
简介: 建立flask容易,那么部署就比较麻烦了,配这个,配那个,更新………… 所以我从构建,就考虑部署的问题,使用docker部署. 程序都打包进docker,本博客有相关文章. pycharn直接 ...
随机推荐
- 洛谷2085最小函数值(minval) + 洛谷1631序列合并
题目描述 有n个函数,分别为F1,F2,-,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
- 聊聊、Zookeeper Windows启动
Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly rel ...
- Beginning Auto Layout Tutorial in iOS 7: Part 1
可以更好的结局屏幕方向和兼容iphone和ipad的解决方案. iOS6有一个新的技术auto layout来帮助解决这个问题.这个技术不仅可以支持app不同尺寸下的开发,而且你也不需要为每一种语言创 ...
- api 接口开发理论 在php中调用接口以及编写接口
如: http://localhost/openUser.php?act=get_user_list&type=json 在这里openUser.php相当于一个接口,其中get_user_l ...
- 防止sql注入和跨站脚本攻击,跨站请求伪造以及一句话木马的学习记录
以下是来自精通脚本黑客的学习记录 防止以上漏洞的最好的方式 一对用户的输入进行编码,对用户输入进行编码,然后存入数据库,取出时解码成utf-8 二对用户的输入进行过滤,过滤jscript,javasc ...
- Windows下批处理命令启动项目bat脚本
文件env.cfg #server name SERVER_NAME=ActivitiService #JDK Home JDK_HOME= #Main MAIN_CLASS=com.nbtv.com ...
- 2016.10.18kubernetes 的8080和6443端口的区别与联系
由看过的资料知道,可以使用kubectl,client libraries和REST请求来访问api. 来自官方资料: By default the Kubernetes APIserver se ...
- 转: java服务器端成长指南
from: http://m.blog.csdn.net/article/details?id=45797155 前言 这是一份针对新手的服务端开发入门与进阶指南.遇到问题及时问你的 mentor ...
- Galileo Gen2 之MQTT通讯
前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. Galileo系统:完整版Yocto,内核版本3.8.7-yocto-standard:宿主机:Windows 7 64 bit 这期主要讲 ...
- C# 读取Excel中的数据
#region 读取Excel中的数据 /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name=&quo ...