在heroku python应用程序上使用什么端口

时间:2015-01-12 10:17:51

标签: python heroku twisted

所以我创建了2个iOS应用程序(一个发送坐标,一个接收它们)和一个python服务器。其中一个应用程序将GPS坐标发送到我在heroku上托管的python服务器。然后,服务器将接收到的GPS坐标发送到OTHER iOS客户端应用程序,该应用程序将在接收的坐标上放置Apple Maps引脚。

在使用任何指定端口在本地主机上进行测试时,该项目可以正常运行。但是,当我将服务器迁移到Heroku时,我收到了this error发生错误,因为Heroku设置了它自己的端口供您使用,我的代码指定了哪个端口。我一直在浏览SO,试图在他们使用os.environ["PORT"]之类的情况下实现其他人的解决方案等等,但是由于我的新手Python和Twisted技能,我还没有成功地让iOS应用程序正确沟通与Heroku服务器在正确的端口上。我的服务器代码如下:(注意:我使用的是Twisted)

import os
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class IphoneChat(Protocol):
def connectionMade(self):
    #self.transport.write("""connected""")
    self.factory.clients.append(self)
    print "clients are ", self.factory.clients

def connectionLost(self, reason):
    self.factory.clients.remove(self)

def dataReceived(self, data):
    #print "data is ", data
    a = data.split(':')
    if len(a) > 1:
        command = a[0]
        content = a[1]

        msg = ""
        if command == "new":
            self.name = content
            msg = content

        elif command == "msg":
            msg = self.name + ": " + content

        print msg

        for c in self.factory.clients:
            c.message(msg)

def message(self, message):
    self.transport.write(message + '\n')


factory = Factory()
factory.protocol = IphoneChat
factory.clients = []
port = 3000
reactor.listenTCP(port, factory)
print "Iphone Chat server started on port ", port
reactor.run()

2 个答案:

答案 0 :(得分:6)

Heroku在您的设置中有一个部分,您可以在其中定义环境变量。

我在本地运行Django时有类似的情况,但类似的修复可能对你有帮助。

在heroku信息中心中,选择您的应用,然后点击设置标签。

然后,如果您点击显示配置变量并使用值ON_HEROKU添加密钥名称True(或类似内容,如果您愿意)。

然后在你的python中:

import os
ON_HEROKU = os.environ.get('ON_HEROKU')

if ON_HEROKU:
    # get the heroku port
    port = int(os.environ.get('PORT', 17995))  # as per OP comments default is 17995
else:
    port = 3000

我不能100%确定如果得到(' PORT')是正确的,我就是这样做的。

将它实现到您自己的代码中会涉及到:

factory = Factory()
factory.protocol = IphoneChat
factory.clients = []

import os
ON_HEROKU = os.environ.get('ON_HEROKU')
if ON_HEROKU:
    # get the heroku port 
    port = int(os.environ.get("PORT", 17995))  # as per OP comments default is 17995
else:
    port = 3000

reactor.listenTCP(port, factory)
print "Iphone Chat server started on port %s" % port
reactor.run()

答案 1 :(得分:0)

答案如下。端口是由Heroku在环境变量中设置的,在此示例中,仅当PORT环境变量不存在(在本地)时,才在本地使用17995。

port = int(os.environ.get("PORT", 17995))
app.run(host='0.0.0.0', port=port)

来源:https://blog.heroku.com/python_and_django