在Flask中使用什么API来检查某些远程(其他)服务器的连接?

时间:2014-01-08 23:04:07

标签: python flask

我在常规py文件中有一些脚本来检查所需的URL是否已连接。

import urllib2
import time
global xUrl
Url = 'http://stackoverflow.com/'

def checkNetwork():
    try:
   response=urllib2.urlopen(Url,timeout=1)
       return True
    except urllib2.URLError as err: pass
    return False

while 1:
   if checkNetwork() == 1:
      print "Connected to", Url
   else:
      print "Cannot Connected to", Url

   time.sleep(5)
   pass

对于在烧瓶中实施,我确实尝试了这个:

@app.route('/status/')
@auth.login_required
def checkNetwork():
   user = auth.get_logged_in_user()
   optiondetails = Optionplatform.select().where(Optionplatform.user==user.id)  
   xUrl = Optionplatform.remoteserver #i edited the posted questions. 

   try:
      response = urllib2.urlopen(xUrl,timeout=1)
      status = "Connected to " + xUrl
      return render_template('checkNetwork.html', status)
   except urllib2.URLError as err: 
      status = "NOT Connected to " + xUrl
      return render_template('checkNetwork.html', status)

   return render_template('checkNetwork.html')

和模板,

<html>
<head> </head>
<body>
{% block content_details %}

 <p>{{ status }} </p>
{% endblock %}
</body>
</html>

但是得到了这个错误: Error Messages 问题是,如何在烧瓶中实施?应该使用Flask中的哪些API?而不是urllib32打开一些URI并检查,连接或不连接到远程服务器。

感谢您的任何建议。

根据米格尔的回答/评论编辑: 这里的模型。

class Optionplatform(db.Model):
   user = ForeignKeyField(User, related_name='user_option')
   remoteserver = TextField()
   token = TextField()

根据@miguel的建议,在我写之前就像@miguel说的那样:

xUrl = optiondetails.remoteserver

但稍后会出现错误消息,表明在models.py中没有“remoteserver”。这里的错误消息“AttributeError:'SelectQuery'对象没有属性'remoteserver'”。

other error messages

所以我改为:

xUrl = Optionplatform.remoteserver

错误消息在第一张图片中。

2 个答案:

答案 0 :(得分:0)

您发送给xUrl的{​​{1}}参数必须是字符串(或urllib2对象,但这似乎不是您的意思无论如何都想要。)

从堆栈跟踪中看来,xUrl是来自Flask-Peewee的urllib2.Request对象。

您没有显示模型的定义,但我相信这是错误的代码:

TextField

我想你想要:

optiondetails = Option.select().where(Option.user==user.id)
xUrl = Optionp.remoteserver

或者接近,你知道你的模特而我不知道,所以你必须适应它。重要的是你要确保放在xUrl中的是带有URL的字符串。

答案 1 :(得分:0)

这是一种更简单的方法,使用优秀的requests library

import requests

@app.route('/status/')
@auth.login_required
def checkNetwork():
   user = auth.get_logged_in_user()
   optiondetails = Optionplatform.select().where(Optionplatform.user==user.id)  
   xUrl = optiondetails.remoteserver #i edited the posted questions. 

   status = None
   try:
      r = requests.get(xUrl)
   except requests.exceptions.ConnectionError: 
      status = "Network Error while connecting to {}".format(xUrl)

   if r and str(r.status_code)[0] not in ('2','3'):
      status = "URL {} returned {}".format(xUrl, status_code)
   else:
      status = "Connection established to {}".format(xUrl)

   return render_template('checkNetwork.html', status=status)