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

What port to use on heroku python app

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

该项目在具有任何指定端口的本地主机上进行测试时完美运行。然而,当我将服务器迁移到 Heroku 时,我收到了 this error The error occurs because Heroku sets it's own port for you to use, where as my code was specifying which port to use. I have been browsing SO for numerous hours trying to implement other peoples solutions where they use 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()

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

我在本地使用 运行 Django 时遇到了类似的情况,但类似的修复可能会对您有所帮助。

在 heroku 仪表板中,select 您的应用,然后单击设置选项卡。

然后,如果您单击“显示配置变量”并添加键名 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% 确定 get('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()

答案如下。端口由 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