今天帮一个学生解决tornado的部署问题,在此记录了这其中的过程,其中的tornado项目更换为demo示例。
开发环境:
本地开发环境:Win10 + Python3.5.4 + PyCharm
线上环境:Centos7.3 + Python3.5.4
第一步:本地项目编写。Python3.x适用,并且已经安装并配置好了环境变量
1. 首先创建名为torn_test的虚拟环境
virtualenv --python=python.exe --no-site-packages torn_test # Windows环境使用
2. 启动虚拟环境,执行这个文件:虚拟环境文件夹下Scripts\activate
torn_test\Scripts\activate # 此时你的cmd里的路径前应该是这样的:(torn_test) F:\torn_test>
# 退出虚拟环境执行:torn_test\Scripts\deactivate.bat # 此时你的cmd里的路径前应该是这样的:F:\torn_test>
3. 项目依赖模块下载,cd到torn_test文件夹内
pip install virtualenv
pip install requirements
pip install tornado
# 此时如果你执行pip list就可以看到这几个包都被放在虚拟环境里了,跟外部的大的Python解释器无关,只要你在激活虚拟
# 环境的状态,所有的pip都将下载到虚拟环境里
Package Version
------------ -------
pip 10.0.1
requirements 0.1
setuptools 39.2.0
six 1.11.0
tornado 5.0.2
wheel 0.31.1
4. 在这里创建tornado项目,项目名为my_project,其实tornado项目就是一个文件夹
项目的整体目录结构为:
my_project # 项目文件夹
├─static # 静态文件夹,low项目,没js...
│ └─commons.css # css文件
├─templates # 项目模板文件夹
│ ├─index.html # 主页
│ └─login.html # login登录页
├─readme # 这个就是本文件啦
├─requirements.txt # 依赖包管理文件
└─tor.py # 项目主文件
# 项目代码在稍后的列出...
5. 用requirements记录所有依赖包及精确版本号
cmd执行cd命令,切换到my_project中,执行:
pip freeze > requirements.txt # 此命令就把你所有的依赖包保存到了这个txt文件内
# pip install -r requirements.txt # 此命令下载时依赖模块时执行
6. 上面没有问题,就可以粘贴代码了
第二步:拷贝demo的代码,感谢demo的提供者,oldboy的小猪沛齐,这是他讲tornado时的笔记.....


h1{
color: green;
}


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"> </head> <body> <h1>循环</h1> <ul> {% for item in user_list %} <li>{{item}}</li> {% end %} </ul> <h1>索引:{{user_list[0] }}</h1> <h1>索引:{{user_dict['id'] }}</h1> <h1>索引:{{user_dict.get('id') }}</h1> <script></script> </body> </html>


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href='{{static_url("commons.css")}}' rel="stylesheet" /> </head> <body> <h1>用户登录</h1> <form method="post"> {% raw xsrf_form_html() %} <input type="text" name="user" /> <input type="text" name="pwd" /> <input type="submit" value="提交"> {{msg}} </form> <script></script> </body> </html>


import tornado.ioloop import tornado.web class LoginHandler(tornado.web.RequestHandler): def initialize(self): pass def get(self): self.render('login.html',msg="") def post(self): # # GET # self.get_query_argument() # self.get_query_arguments() # # POST # self.get_body_argument() # self.get_body_arguments() user = self.get_argument('user') pwd = self.get_argument('pwd') if user == 'wang' and pwd == '666': # self.redirect('http://www.oldboyedu.com') # self.set_cookie('xxxxxx',user) self.set_secure_cookie('xxxxxx',user) self.redirect('/index') return self.render('login.html',**{'msg':'用户名或密码错误'}) # self.render('login.html',msg = '用户名或密码错误') class AuthHandler(tornado.web.RequestHandler): def initialize(self): self.username = self.get_secure_cookie('xxxxxx') class IndexHandler(AuthHandler): def get(self): if not self.username: self.redirect('/login') return user_list = ['wang','li'] user_dict = {'id':1,'name':'zhang'} self.render('index.html',user_list=user_list,user_dict=user_dict) settings = { 'template_path':'templates', 'static_path':'static', 'static_url_prefix':'/xxx/', "xsrf_cookies": True, "cookie_secret":'asdfasdfdfdfsdfsdfsdf' } application = tornado.web.Application([ (r"/login", LoginHandler), (r"/index", IndexHandler), ],**settings) if __name__ == "__main__": # 创建socket对象 application.listen(8888) # conn,add = socket.accept() tornado.ioloop.IOLoop.instance().start()


#!/usr/bin/env python # -*- coding:utf-8 -*- #程序启动的配置 START_CONFIG = { "host": "xxx.xxx.xx.xx", "port": "xxxx", } #日志的路径 LOG_CONFIG = { "file_path": "/xxx/xxx/xxx/xxxx/xxx.log", } #rabbitmq的连接信息 RABBITMQ_CONFIG = { "host": "xxx.xxx.xx.xx", "port": 1111, "vhost": "/", "user": "xxxx", "passwd": "xxxx", "serverid": "xxxxx", "SEND_EXCHANGE": "xxxxxxx", "RECV_EXCHANGE": "xxxxxxx", } # 数据库配置 DB_CONFIN = { "host": "xxx.xxx.xx.xx", "port": 3306, "db": "xxx", "user": "xxxxx", "passwd": "xxxxxxx", }
第三步:本地测试
1. OK,代码粘贴完毕,就在本地测试一遍
运行tor.py
浏览器地址栏输入:
http://127.0.0.1:8888/login # 输入用户名和密码后能跳转就完事了
2. 上面几步没有问题的话,本地就算完事了
第四步:部署到Centos
首先你要有Python3.x的解释器并配好了环境变量。什么?连这一步都没做好?那就先去搞环境去吧
http://www.cnblogs.com/Neeo/p/7897010.html # 拿走不谢
当你看到这一行的时候,你前面的每一步都OK才行,以下步骤在xshell(已远程连接到centos)里执行...
1. 下载virtualenv
pip install virtualenv
pip install virtualenvwrapper # 这一步是另一种方式创建虚拟环境,在此这时候下载备用
2. 创建虚拟环境
virtualenv venv1 # 创建虚拟环境文件夹
# 嘿嘿,这一步你可能会提示:bash: virtualenv: 未找到命令... 或者bash: virtualenv: command not found...
那么说明你virtualenv的软连默认没有搞上...心塞!我怀疑(不可靠)是自定义安装Python解释器导致的
解决办法就是建软连呗:https://www.cnblogs.com/Neeo/p/7869027.html # 拿走不谢
3. 激活虚拟环境
source venv1/bin/activate # 成功则显示: (venv1) [root@bogon tmp]#
4. 此时你就可以把项目搞到服务器了
# 不知道怎么搞文件?用Xmanager的Xftp传。这也没有?出门左转把垃圾带走
比如此时把my_project项目搞到了venv1内,然后cd进my_project,执行:
pip install -r requirements.txt # 从这里把项目所有的依赖包一次都能下载完成,并且这些包仅在你的虚拟环境内
5. 此时,应该是项目依赖包已经下好后,其他的前面都没问题了,我们开始正经的运行tornado项目
python tor.py # tornado项目跑起来
6. 浏览器访问它
http://192.168.0.106:8888/login # 浏览器地址栏输入,当然你输入的不是这个ip地址,是你自己的....
7. 是不是出现了页面了!啦啦啦完事!
结果展示:
问题总结:
1. demo演示了tornado的基本用法,包括路由的配置,静态页面的配置等等
2. 项目太小了,部署到到centos上跟玩似的,并没有涉及到高深的配置问题,比如部署django项目时,要配置uwsgi和nginx等等
3. 部署难点,虚拟环境创建,这里百度上都总结的挺简单的,下载virtualenv,然后创建虚拟环境,感觉他们都没有碰到问题...
4. 如果是阿里云或者别的云服务器,则有云服务器的拦截规则,我们要去查看tornado的端口是否被拦截,如果被拦截,则如何去打开
5. 上面的问题同样存在于centos上,防火墙是否拦截
6. 并没有涉及到数据库的问题,等等
欢迎指正