FLASK
标签(空格分隔): python flask web
[TOC]
计划
- [ ] python学习
- [ ] 数据库安装
- [ ]
架构
client(HTTP请求)
模板
JinJa2
模板的简单使用
条件语句
{% if xxx%}
{% else %}
{% endif %}
循环语句
{% for user in users%}
{{user.id}} {{user.name}}
{% endfor %}
模板的继承
#基类 base.html文件
<html>
xxxx
{% block content %}
{% end block %}
xxxxx
</html>
#子类
{% extends "base.hmtl" %} #扩展基类
{% block content %} #实现子类独有部分
xxx
{% end block %}
class User(object):
def __init__(self, name, id):
self.name = name
self.id = id
from flask import render_template
#module.py文件导入user类
from module import User
app = flask(__name__)
@app.route('/user')
def user():
user = User("brezen",1)
return render_template('user_index.html', user=user)
<h1>{{user.name}}</h1>
MVC
module
view
control
Files DB
nginx
nginx是web服务器
安装
使用
- 1, 查看状态
sudo service nginx status
WSGI
WSGI(python web server getway interface)
定义了web服务器和web应用之间的接口规范
clinet<----------->server<=WSGI=>APP
FLASK框架就是一个WSGI的app应用
WSGI Server有哪些:
比如 Flask,webpy,Django、CherryPy 都带着 WSGI server 。当然性能都不好,自带的web server 更多的是测试用途, 发布时则使用生产环境的 WSGI server或者是联合nginx做uwsgi 。
常用的WSGI服务器器
- Gunicorn
- uWSGI
- CherryPy
- Tornado
- Gevent
- mod_wsgi
gunicorn
flask 自带的服务器,完成了 web 服务的启动。生产环境下,flask 自带的 服务器,无法满足性能要求。我们这里采用 gunicorn 做 wsgi容器,用来部署 python。
前端Nginx负载,几个核就跑几个Gunicorn进程,gunicorn相对后面的app又可以给出几个进程。
virtualenv
解决问题:
1,python版本问题
2,依赖问题
3,权限问题
linux系统权限要求高,安装文件比较麻烦,但是
安装
sudo pip install virtualenv
创建虚拟环境
virtualenv venv(名字,随便写的)
启动虚拟环境
source venv/bin/activate
关闭虚拟环境
deactivate
POSTMAN
测试HTTP方法
supervisor
管理多个python web app应用,一个部署在80端口,另外一个部署在81端口。
安装
sudo apt-get install supervisor
使用
- 1,通过配置文件,启动应用程序
总的配置文件在/etc/supervisor目录下,这个文件通过包含
/etc/supervisor/conf.d/*.conf
#配置文件内容
#应用名称
[program: app]
#应用命令行
###############通过python 启动py应用
command = python /home/sbin/xxx.py
supervisor配置说明
注意:如果有多个应用,可以在目录下增加多个conf文件
- 2,使用supervisoctrl控制台,控制应用程序
- 3, 启动supervisor
sudo service supervisor start
- 4,进入supervisorctl控制台
sudo supervisorctl
会列出启动的app
#启动应用程序
start app
#停止应用程序
stop app
#查看应用程序状态
status
http://local/user?id=xxx
request.args.get('id')
反向路由
from flask import Flask, request, url_for
##视图
@app.route('/query_user')
##视图函数
def query_user():
id = request.args.get('id')
@app.route('query_url')
def query_url():
###反向路由
return 'query_url' + url_for('query_user')
安装应用依赖包
pip install -r requiment.txt
注意:这个依赖包不是指webserver工具或者db工具,而是应用依赖的一些库文件。
pip list 查看已经安装的库
部署步骤
安装
vitualenv, supervisor, db,
创建虚拟环境
激活虚拟环境
配置nginx服务器
在/etc/nginix/sites.avaliable下创建配置文件
在/etc/nginix/sites.enable下创建配置文件的软连接
启动ngnix服务器
sudo service ngnix reload
如果启动失败,可以查看ngnix服务器的日志
配置supervisor
因为在虚拟环境中,所以配置命令有所改变,通过虚拟命令来启动
command = /home/sbin/Todo/venv/bin/gunicorn b 127.0.0.1:9000
其中`/home/sbin/Todo/venv/`表示用户启用的虚拟环境的路径
进入supervisorctl控制台启动程序
部署flasky
安装virtualenv
安装supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默认配置文件
安装gunicorn
gunicorn -w4 manage:app
安装nginx
配置nginx
/etc/sites-avaliable下新建一个配置文件
并建立配置文件的软连接到/etc/nginx/site-enable/目录下
启动nginx
sudo service nginx start
sudo service nginx reload
查看启动错误日志
/var/log/nginx/error.log
CGI
客户端(提交表单请求)------>服务器
服务器<--------------------->外部程序
(服务器和外部程序交互完成,生成一个新的HTML)
客户端<---------------------服务器(将新的HTML返回给客户端)
以上这个过程发生在服务器CGI(common gateway interface)接口上的。
bluePrint(蓝图)
为什么要使用蓝图
- 1,程序模块化
- 2,集中注册入口,统一管理
- 3,每个模块可以统一使用各自URL前缀
- 4,每个模块可以使用各自的模板
如果所有的路由都放到一起,那么对于大型程序来说,将面临以下问题:
- 1)一般情况下,前台和后台用两套模板。或者通俗的讲,前台费力弄得好看点,后台反正自己用,能用就成,丑点无所谓。那么怎么让前台和后台用两套模板?
- 2)后台部分逻辑比前台复杂,还需要导入新的包,如果和前台写在一个文件里,后面修改会不会容易出错,例如本来改后台部分结果牵连前台出问题?
- 3)既然Python力求简洁,那代码能否再简洁些?比如新增的路由参数 /admin 重复写了4遍,能不能对后台定义一个前缀,后台部分的自动加这个/admin ?
- 4)如果这个博客程序需要多人来维护,多人编辑同一个文件去提交时冲突如何解决?
问题4,import …… ,这样不就模块化了?
网站
FLASK主页
KT-WEB个人开发的网站
Flasky图灵图书里的例子
flask中文学习网
Virtualenv+Gunicorn+Supervisor+Nginx环境搭建
环境部署,详细说明
bluePrint