今天帮一个学生解决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;
}

commons.css

<!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>

index.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>

login.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 == '':
# 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()

tor.py

#!/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",
}

本demo没有的config配置

第三步:本地测试

  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. 并没有涉及到数据库的问题,等等

欢迎指正  

Centos7部署tornado项目的更多相关文章

  1. centos7部署JavaWeb项目

    centos7部署JavaWeb项目共有三步 1.配置java环境 2.配置tomcat环境. 3.部署JavaWeb项目 一.配置java环境 1.1安装java 参考我的另一篇博文:https:/ ...

  2. centos7 部署vue项目(前后端分离、nginx)

    一.环境准备 1.centos7系统 2.mysql数据库 3.在centos7虚拟机上安装好nginx 二.部署内容准备 1.后端war包 或者可执行jar 因为我这里是spring boot项目. ...

  3. CentOS7部署Django项目

    1. 云服务器 这里使用的是腾讯云选择系统:CentOS7.3 记住云服务器登录密码 2. 配置Python3环境 默认Python环境为python2.7,yum安装是需要python2的环境的 安 ...

  4. Centos7部署FytSoa项目至Docker——第一步:安装Docker

    FytSoa项目地址:https://gitee.com/feiyit/FytSoaCms 部署完成地址:http://82.156.127.60:8000/ 先到腾讯云申请一年的云服务器,我买的是一 ...

  5. Centos7部署FytSoa项目至Docker——第三步:部署程序

    FytSoa项目地址:https://gitee.com/feiyit/FytSoaCms 部署完成地址:http://82.156.127.60:8000/ 我买的是一年99标准型SA2云服务器 购 ...

  6. CentOS7 部署 Django 项目

    1. 更新系统软件包 yum update -y 2. 安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools" yum in ...

  7. 阿里云 Centos7 部署 Django 项目

    前期准备 阿里云服务器 mysql数据库 已经本地运行成功的项目 阿里云服务器的环境配置 Git #代码管理 Gitlab #代码托管,要求服务器内存不低于2G,我选择放弃 Mysql #连接数据库 ...

  8. 部署Flask项目到腾讯云服务器CentOS7

    部署Flask项目到腾讯云服务器CentOS7 安装git yum install git 安装依赖包 支持SSL传输协议 解压功能 C语言解析XML文档的 安装gdbm数据库 实现自动补全功能 sq ...

  9. centos7+tomcat部署JavaWeb项目超详细步骤

    我们平时访问的网站大多都是发布在云服务器上的,比如阿里云.腾讯云等.对于新手,尤其是没有接触过linux系统的人而言是比较有困难的,而且至今使用云服务器也是有成本的,很多时候我们可以通过虚拟机自己搭建 ...

随机推荐

  1. PHP 类名::class含义

    自 PHP 5.5 起,关键词 class 也可用于类名的解析. 使用 ClassName::class 可以获取一个字符串,包含了类 ClassName 的完全限定名称.这对使用了命名空间的类尤其有 ...

  2. leetcode34. Find First and Last Position of Element in Sorted Array

    二分查找不只是查找,还可以根据需求添加条件进行查找,比如这个题,左端点的条件就是边界点或者小于target,右端点的条件就是!=size()或者大于.根据这个找到查找的条件

  3. Dockerfile详解(三)

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  4. iOS 开发笔记-控制器tab切换view显示

    在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换.tar切换,原理就是在一个controller里面,显示另一个controll ...

  5. python selenium截取指定元素图片

    1.截取当前屏幕 @property def getImage(self): ''' 截取图片,并保存在images文件夹 :return: 无 ''' timestrmap = time.strft ...

  6. windows连接远程win服务器失败,win7win10都存在此问题,显示出现身份验证错误,要求的函数不受支持,可能由于CredSSP加密Oracle修正 (原)

    之前电脑windows+mstsc连接另一个windows服务器正常登陆,可在更新本地系统为win10以后,登陆就出现了问题,提示的错误是,出现身份验证错误.要求的函数不受支持,可能由于CredSSP ...

  7. HDU 2276 Kiki & Little Kiki 2(矩阵位运算)

    Kiki & Little Kiki 2 转载自:点这里 [题目链接]Kiki & Little Kiki 2 [题目类型]矩阵位运算 &题意: 一排灯,开关状态已知,每过一秒 ...

  8. 004-全局应用程序类Global.asax

    服务器对象:Request.Response.Server.Session.Application.Cookie //功能1:为服务器对象注册Start.End处理 protected void Ap ...

  9. .net中ashx文件有什么用?功能有那些,一般用在什么情况下?

    .ashx是“一般处理文件”.和aspx类似.但是这种文件要比aspx这种前台页面文件内容简单轻巧..ashx不提供前台展示的功能.也可以说它结合了.cs类文件而且又可以提供给.aspx文件做UI层的 ...

  10. jdbc连接oracle的几种格式

    1. SID的方式.已经不推荐使用这种方式了. jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>] ...