flask gevent 长连接中 怎么写一个socket连接

分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短-分享-最代码广告加载中,请稍后...&&分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短老外的风格由编辑于 9:46:071个牛币请下载代码后再发表评论//Fd/Fd/.classpath/Fd/.project/Fd/.settings/Fd/.settings/org.eclipse.jdt.core.prefs/Fd/bin/Fd/bin/xs/Fd/bin/xs/Login.class/Fd/bin/xs/My.class/Fd/bin/xs/My1.class/Fd/src/Fd/src/xs精精精原精原原精原精原精原精精最热搜索分享话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关分享原原精原精原精原精精精最近下载暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级最近浏览暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友Ubuntu 部署 Flask + WSGI + Nginx 详解_服务器应用_Linux公社-Linux系统门户网站
你好,游客
Ubuntu 部署 Flask + WSGI + Nginx 详解
来源:Linux社区&
作者:Ray-liang
入手了一台阿里云服务器,是 14.04 32位版本,最初考虑是用来尝尝鲜只是买了个最低配的,价格算起来与在国外买个空间的价格相当吧(可能一年才贵100多),但用起来感觉就很不错,速度那是一个字:快。
自从倒戈向Linux世界后,对于一切大而全的开发框架与软件都有一种不讨喜的感觉,个人更喜欢于使用那些小而精,高性能高产生力的软件和开发框架,So 我现在的第一语言是Python和Coffee,开发框架就当然是 AngularJS (前端) + Flask (后端) ,关于 AngularJS 与 Flask 不在本文的叙述范围之内,本文解决的是 Flask 最后一公里的问题:Linux 部署。
我采用的部署方案是:
Web 服务器采用 uwsgi host Flask
用 Supervisor 引用 uwsgi 作常规启动服务
基于 Nginx 作反向代理
首先, 阿里云服务器可以通过 SSH 指令在本机的终端进行远程连接
@云服务器地址
输入密码进入后所有的操作与本地终端完全一至。
安装 Python 环境
接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python 的 pip 安装工具即可。pip 用于安装一些基于python 应用的软件工具,在下文中将会频繁使用。
如果用python 而不懂 [pip|] 那最好就快点脑补吧, 指令如下:
sudo apt-get install pip
VirtualEnv
不同的项目可能会引用各种不同的依赖包,为了避免版本与和应用之间的冲突而造成的&依赖地狱&[Virtualenv | ] 就是我们python 项目的必须品了。VirtualEnv 可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv 能够做到:
在没有权限的情况下安装新套件
不同应用可以使用不同的套件版本
套件升级不影响其他应用
sudo pip install virtualenv
安装VirtualEnv 后只需要在项目目录内运行 virtualenv 目录名 就可以建立一个虚拟环境文件夹,然后启用 activate 指令即可启用该python虚拟环境,具体操作如下:
假定我的项目目录叫 /home/www/my_flask,首先安装虚拟环境 (我习惯使用的虚拟环境目录叫 venv )
my_flask root$ virtualenv venv
&& New python executable in venv/bin/python
&& Installing setuptools, pip...done.
在项目目录下就会建立一个新的 venv 目录,里面就是运行python 的基本环境的工具与指令,和包。 然后启用该环境,使用当前命令行状态进入虚拟环境,进入虚拟环境后,一切安装python的操作都会将包和引用装在虚拟环境内,而不会影响到全局的python 环境。
my_flask root$ source venv/bin/activate
(venv)my_flask root$
调用 activate 指令后命令符前就会出现 (venv) 字样。 可通过 deactivate 退出虚拟环境。
安装 uWSGI
Flask 的实际生产运行环境选择并不多,比较成熟的是 [Gunicorn|] 和 [uWSGI|] ,听说Gunicorn 的配置很简单,但可惜我一直没有配置成功过,我现采用的是 uWSGI。接下来就安装uWSGI吧。
(venv)my_flask root$ pip install uwsgi
在虚拟环境下不需要使用 sudo ,因为virtualenv 是没有权限要求的。
这个安装很迅速,基本是秒成。安装完成后我们可以先放下 uWSGI 不表,在后面再回过来配置他,因为我们首先要将关键的 Flask环境和我们的项目文件传到服务器目录内。
安装 Flask
我是用清单文件一次性安装Flask和他的相关依赖的,这样会更快。我的引用清单是这样的:requirements.txt
Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Moment==0.4.0
Flask-PageDown==0.1.5
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-WTF==0.10.2
Flask-Cache==0.13.1
Flask-Restless==0.15.0
Flask-Uploads==0.1.3
Jinja2==2.7.3
Mako==1.0.0
Markdown==2.5.1
MarkupSafe==0.23
SQLAlchemy==0.9.8
WTForms==2.0.1
Werkzeug==0.9.6
html5lib==1.0b3
itsdangerous==0.24
six==1.8.0
awesome-slugify==1.6
可以想像,如果一个一个装非疯了不可。安装清单文件:
(venv)my_flask root$ pip install -r requirements.txt
在此还是重重地提一下:一定要注意在运行这个安装之前启用了python 虚拟环境,否则会直接安装到全局去的!
接下来就是上传 Flask的项目文件,之前我在各大的&转载专业户&里找了好多的资料,在这一步中大多只是在上面加个标准的Flask运行文件,虽说做个范例可以但说实在的这很让人迷惑,为什么?先看看代码吧:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
生产环境内,谁会用这样的代码呢,这只是Flask 的最简入门范,我的Flask项目中 app 是被做在包内的,相信很多人都是这样做的,在包外我们采用 Flask Script 写一个 manage.py 文件 作为启动文件,这更方便于支持各种的项目,包括可以安装到 window下的 FastCGI 中。
那么我的 这个 manage.py 是这个样子的:
if os.path.exists('.env'):
print('Importing environment from .env...')
for line in open('.env'):
var = line.strip().split('=')
if len(var) == 2:
os.environ[var[0]] = var[1]
from app import create_app
from flask.ext.script import Manager, Shell
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
def make_shell_context():
return dict(app=app)
manager.add_command("shell", Shell(make_context=make_shell_context))
def deploy():
"""Run deployment tasks."""
if __name__ == '__main__':
manager.run()
这样做我地开发环境可以这样运行 Flask:
python manage.py runserver
更详细的做法请参考 [Flask Script|] 扩展
好吧,我们可以用 支持SSH的FTP工具将Flask项目文件上传到服务器上,下面是整个项目文件结构:
└── my_flask
├── logs
└── venv
├── bin
├── activate
├── easy_install
├── gunicorn
├── pip
└── python
├── include
└── python2.7 -& /usr/include/python2.7
├── lib
└── python2.7
├── local
├── bin -& /home/shenye/shenyefuli/bin
├── include -& /home/shenye/shenyefuli/include
└── lib -& /home/shenye/shenyefuli/lib
└── app
__init__.py
├── manage.py
├── requirements.txt
配置 uwsgi
好了,项目的准备工作已经做完了,是时候回过头去配置 uwsgi 了,它的具体指令可以去看它的官方文档,我们在这里采用其中的一种指令方式:配置起动。我采用 .ini文件作为配置,在项目目录下创建一个 confg.ini (具体见下文)写好后可以这样执行
(venv)my_flask root$ uwsgi config.ini
我认为是最简单的方式,也容易更改。好了重要部分来了,config.ini 是这样写的:
socket = 127.0.0.1:8001
chdir = /home/www/
wsgi-file = manage.py
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9191
注意 : callable=app 这个 app 是 manage.py 程序文件内的一个变量,这个变量的类型是 Flask的 application 类 。
运行 uwsgi
```(venv)my_flask root$ uwsgi config.ini
[uWSGI] getting INI configuration from config.ini
*** Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014] // 此处略去那些无用的启动信息Stats server enabled on 127.0.0.1:9191 fd: 15 ***```
OK, 此时已经正常启动 uwsgi 并将 Flask 项目载入其中了,ctrl+c 关闭程序。但这只是命令启动形式,要使其随同服务器启动并作为后台服务运行才是运营环境的实际所需要。因此接下来我们需要安装另一个工具来引导 uwsgi 。
安装 Supervisor
[Supervisor|]可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。
sudo apt-get install supervisor
Supervisor 的全局的配置文件位置在:
/etc/supervisor/supervisor.conf
正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的 *.conf 文件放在
/etc/supervisor/conf.d/
下就可以,那么我们就新建立一个用于启动 my_flask 项目的 uwsgi 的 supervisor 配置 (命名为:my_flask_supervisor.conf):
[program:my_flask]
command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini
directory=/home/www/my_flask
autostart=true
autorestart=true
stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log
sudo service supervisor start
sudo service supervisor stop
安装 Nginx
[Nginx|]是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件。
sudo apt-get install nginx
配置 Nginx
Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将
/ext/nginx/sites-available/default
文件替换掉就可以了。
新建一个 default 文件:
server_name XXX.XXX.XXX;
location / {
uwsgi_pass
127.0.0.1:8001;
uwsgi_param UWSGI_PYHOME /home/www/my_flask/
uwsgi_param UWSGI_CHDIR
/home/www/my_
uwsgi_param UWSGI_SCRIPT manage:
将default配置文件替换掉就大功告成了!还有,更改配置还需要记得重启一下nginx:
sudo service nginx restart
阿里云的服务器运行速度很不错,加上Flask+uWSGI+nginx 这种高性能结构,整个网站响应速度极为之快,每页响应速度不到0.1s , 与之相比我之前使用 C# 部署在Avarix 上的网站(同一个程序,不同语言实现)每页响应速度至少2s 这简直是 200:1的性能,当然我还没有闲到去专们用软件去测这两者之间的差值,写本文的目的也是对此作一记录,以便以后回顾。
Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django&
Ubuntu 12.04 下部署 Nginx+uWSGI+Flask
你应该使用 Nginx + uWSGI
uWSGI + Nginx 部署 Flask Web 应用
Django+Nginx+uWSGI 部署
Linux下Nginx+uWSGI部署Python应用
Ubuntu Server 12.04 安装Nginx+uWSGI+Django环境
5.5 + Nginx 0.8.50 + uWSGI + Django 1.2.3 部署Django项目
Nginx 的详细介绍:Nginx 的下载地址:
更多Ubuntu相关信息见 专题页面
本文永久更新链接地址:
相关资讯 & & &
& (12/31/:38)
& (05/10/:28)
& (09/27/:18)
& (09/01/:35)
& (09/27/:06)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款当前位置:&>& >
使用React和Flask开发一个留言板
使用React和Flask开发一个留言板
发布时间: 15:37:34&&&编辑:
近期要在生产环境上使用react,所以,自己学习了一下,写了一个简单的留言板小程序。完整的代码可以到这里下载: message-boardUse前端使
近期要在生产环境上使用react,所以,自己学习了一下,写了一个简单的留言板小程序。完整的代码可以到这里下载:
前端使用React,然后还有Bootstrap和jQuery,React负责前端展现,jQuery主要是向服务器发送ajax请求。
后端使用Flask和MongoDB,为前端提供数据。这里主要关注前端,对于后端不做过多说明。
使用webpack,对js文件进行打包。
About React
React是facebook开发一个用于前段交互的Javascript库。
刚刚开始使用,有这么几个特点:
1. 组件化开发。React提倡无状态的组件,便于重用。
2. VirtualDOM。React的性能比较高,得益于虚拟DOM。它不会每次都去直接操作DOM,因为操作DOM的代价是很大的,所以,它在内存中维护了虚拟DOM,通过计算虚拟DOM和浏览器上的DOM的变更进行操作。
3. 专注于View。React不是MVC框架,它只是一个专注于View的库,所以,它也可以和很多其他框架或者库一起使用。
4. 提供完成的生命周期。
Message Board
这个留言板小应用,主要有这样几个功能:
1.添加留言,一个表单:用户名和内容
2.列表展示,显示所有留言
3.简单的分页
使用React,就要对应用进行组件的切分,尽量保持组件的无状态。
从宏观上组织整个应用,切分三个大组件:
1. MessageForm,添加留言表单。
2. MessageList,留言列表
3. Pager,留言的分页控制
当然,组件还可以继续划分。
子组件的数据都会回调到MessageBoard中,在这里统一控制。
MessageBoard.js
scriptvar React = require(&react&);
var MessageList = require(&./MessageList&);
var MessageForm = require(&./MessageForm&);
var Pager =
require(&./Pager&);
var MessageBoard = React.createClass({
getInitialState : function(){
messages: [],
submitMessage : function (author, content) {
type:'post',
url:'/message',
data:{author:author,content:content}
}).done(function (data) {
console.log(data);
this.listMessage(1);
}.(this));
listMessage : function(page){
console.log(&listMessages page:&+page)
type:'get',
url:'/messages',
data:{page:page}
}).done(function (resp) {
if(resp.status == &success&){
var pager = resp.
console.log(pager);
this.setState({
messages:pager.messages,
page:pager.page,
pages:pager.pages
}.bind(this));
componentDidMount : function(){
this.listMessage(1);
render : function(){
var pager_props = {
page : this.state.page,
pages : this.state.pages,
listMessage : this.listMessage
&MessageForm submitMessage={this.submitMessage}/&
&MessageList messages = {this.state.messages}/&
&Pager {...pager_props}/&
module.exports = MessageB
MessageForm
一个简单的表单,保存留言。用户提交后,数据会传给父组件。MessageForm.js
javascriptvar React = require(&react&);
var MessageForm = React.createClass({
handleSubmit : function (e) {
e.preventDefault();
var author = this.refs.author.getDOMNode().value.trim();
var content = this.refs.content.getDOMNode().value.trim();
this.props.submitMessage(author,content);
this.refs.author.getDOMNode().value = &&;
this.refs.content.getDOMNode().value = &&
render : function(){
&div className=&well&&
&h4&Leave a Message:&/h4&
&div role=&form&&
&div className=&form-group&&
&input ref=&author& className=&form-control& placeholder=&Name&/&
&textarea ref=&content& className=&form-control& rows=&3& placeholder=&Leave your message here&&&/textarea&
className=&btn btn-primary& onClick={this.handleSubmit}&Submit&/a&
module.exports = MessageF
MessageList
留言的列表展示,在写列表之前,把每条留言写成一个组件Message.js
javascriptvar React = require(&react&);
var Message = React.createClass({
render : function(){
var msg = this.props.
&h3&{msg.author}
&small&{msg.time.toLocaleString()}&/small&
&p&{msg.content}&/p&
module.exports = M
然后,再写列表.
数据从父组件通过props传递进来
MessageList.js
javascriptvar React = require(&react&);
var Message = require(&./Message&);
var MessageList = React.createClass({
render : function () {
var messages = this.props.messages.map(function(item){
return &Message message={item}/&
console.log(messages);
{messages}
module.exports = MessageL
这是一个简单的分页,会显示当前页和总页数,还有上一页和下一页功能。Pager.js
javascriptvar React = require(&react/addons&);
var Pager = React.createClass({
getDefaultProps : function(){
clickHandler: function(e){
e.preventDefault();
console.log(e.target.dataset.page);
console.log(e.target.dataset.page.value);
this.props.listMessage(e.target.dataset.page);
render : function(){
var cx = React.addons.classS
var preClass = cx({
'previous':true,
'disabled':this.props.page == 1
var nextClass = cx({
'next':true,
'disabled':this.props.page == this.props.pages
&ul className=&pager&&
&li className={preClass}
onClick={this.clickHandler}&
&a href=&#& data-page={this.props.page-1}&&Prev&/a&
&span&{this.props.page}/{this.props.pages}&/span&
&li className={nextClass}
onClick={this.clickHandler}&
&a href=&#& data-page={this.props.page+1}&Next&&/a&
module.exports = P
一个简单的小只能简单的感受一下React,这个库的思路和当前流行的库和框架相比,还是比较新颖的,值得学习~
本文来自:
本文链接:
相关热词搜索:

我要回帖

更多关于 flask 数据库连接池 的文章

 

随机推荐