【问题标题】:What port to use on heroku python app在 heroku python 应用程序上使用什么端口
【发布时间】:2015-01-12 10:17:50
【问题描述】:

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

在使用任何指定端口的本地主机上进行测试时,该项目可以完美运行。但是,当我将服务器迁移到 Heroku 时,我收到了this error 发生错误是因为 Heroku 设置了它自己的端口供您使用,而我的代码指定了要使用的端口。我已经浏览了好几个小时,试图实现其他人的解决方案,他们使用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()

【问题讨论】:

    标签: python heroku twisted


    【解决方案1】:

    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% 确定 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()
    

    【讨论】:

    • 嘿,尼尔!感谢回复!我实现了你的解决方案,但是它又回到了“未能在 60 秒内绑定错误”link
    • @Aimee 您是否确保已在 heroku 仪表板中正确设置了变量?它应该看起来像 this
    • @Aimee,您可能需要检查 os 变量是否获取正确的数据,如果它没有找到 PORT(哈利波特无意中引用) 然后它将默认为 5000,如果这不是 Heroku 设置的,那可能是导致问题的原因。原始信息可在 Heroku 文档here 中的 Flask 教程中找到
    • Ashhley Hickman 我看了你的图片,意识到我没有按“保存”,但是我按了保存并重新启动了测功机。查看日志,端口最终为 17995,因此我将应用程序的服务器地址更改为“enigmatic-beyond-7671.herokuapp.com”并将端口更改为 17995,但它仍然没有记录 GPS 的坐标。
    • 本地还在工作吗?没有对代码的实际工作进行任何调整,只是以运行代码的服务器的位置为条件。这个问题可能比这个问题的范围更深。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多