框架做了些什么
服务端按照职责仔细划分,可以分为服务器+框架,服务器server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端。框架处理的工作是接收由server转发的request,处理请求,并将处理结果返回给server。其中server和框架之间定义了一种通信规范,叫wsgi协议。
所以,框架一般只做路由分发和视图处理,但是也有例外,比如tornado就自己实现了服务器的功能。
做一下总结,在web开发中程序员写代码相当于站在flask框架这个人的肩膀上,而flask这个框架程序的实现又是基于实现了wsgi的socket服务端程序的,比如werkzurg.
werkzurg
from werkzeug.serving import run_simple
from werkzeug.wrappers import Request, Response
@Request.application
def run(request):
return Response('hhh')
if __name__ == '__main__':
run_simple('', 5000, run)
框架对比
框架都有的一个功能就是路由分发。这也是框架最基础的功能。从框架的轻质来分:
重量级框架: 如Django,除了实现路由,还实现自己的template,为了操作数据库方便还有自己的orm,功能全。但是不易自定制,例如想要更换内置的orm,因为框架内部依赖比较紧密,所以牵一发而动全身。
轻量级框架:如Flask,核心就是基于weekzurg的路由,模版用的是第三方的jinja2,没有自己的orm,可以借助第三方,如sqlalchemy。要用什么完全由开发者决定。
基本使用
from flask import Flask
app = Flask(__name__)
@app.route("/")
def idnex():
return 'index'
if __name__ == '__main__':
app.run()
对于这个最基本的程序,有几点需要说明:
- 导入包的时候最好不要使用
from flask import *
,PEP8不建议这么做,最直观的感受是看代码的人不知道程序的模块到底来自哪个包 - 用FLask类实例化的时候传入了
__name__
,__name__
的含义是模块名,Flask类有默认的static参数,当我们在浏览器输入http:127.0.0.1:5000/static/index.html', flask框架怎么知道去哪个目录下找index.html这个文件呢?答案就是这里的
name, 根据
name得到的模块名所在的目录,把这个目录当作根目录,flask会去这个根目录下寻找静态目录的静态文件。如果随便写了一个不存在的模块,如
app=Flask('qwewq')`,那么flask会自作主张就把当前py文件所在目录当作根目录。 - app.run 这个方法是开启一个简单的服务器,在实际生产中这一步会被替换的
- 我们在浏览器输入
http:127.0.0.1:5000/static/index.html',flask当拿到请求的url看到前缀是和
static_url_path`设置的一样时,就会去静态目录去找文件而不走路由 - django项目的py文件放置位置大体是固定的,但是flask项目文件的组织形式由开发者来定
linux安装虚拟环境
虚拟环境使用virtualenv创建,可以查看系统是否安装了virtualenv:$ virtualenv --version
安装虚拟环境:
$ pip install virtualenv
$ pip install virtualenvwrapper
安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 3、运行
source ~/.bashrc
创建虚拟环境:mkvirtualenv flask_test
进入虚拟环境:$ workon flask_test
退出虚拟环境: 如果所在环境为真实环境,会提示deactivate:未找到命令 $ deactivate Flask_py