2016-07-27 34 views
1

所以我有一個瓶子應用程序在一個機器上的virtualenv(樹莓派運行raspbian),一切工作得很好,但是當我移植到另一個樹莓pi,也運行raspbian,並建立一個新的virtualenv完全相同的規格,運行應用程序拋出:Python - NameError:名稱'PROTOCOL_SSLv3'沒有被定義,當使用gevent

Flask應用程序是一個socket-io聊天應用程序,它使用ajax和東西。

Traceback (most recent call last): 
File "application.py", line 10, in <module> 
from flask.ext.socketio import SocketIO, emit 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/flask/exthook.py", line 62, in load_module 
__import__(realname) 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/flask_socketio/__init__.py", line 2, in <module> 
monkey.patch_all() 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/gevent/monkey.py", line 185, in patch_all 
patch_socket(dns=dns, aggressive=aggressive) 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/gevent/monkey.py", line 124, in patch_socket 
from gevent import socket 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/gevent/socket.py", line 659, in <module> 
from gevent.ssl import sslwrap_simple as ssl, SSLError as sslerror, SSLSocket as SSLType 
File "/home/host/chat-server/venv/local/lib/python2.7/site-packages/gevent/ssl.py", line 386, in <module> 
def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): 
NameError: name 'PROTOCOL_SSLv3' is not defined 
Exception KeyError: KeyError(3061183472L,) in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored 

建立VENV是如下的方法,

virtualenv venv 
source venv/bin/activate 
pip install -r requirements.txt 

requirements.txt樣子,

Flask==0.10.1 
Flask-SocketIO==0.3.7 
Jinja2==2.7.2 
MarkupSafe==0.23 
Werkzeug==0.9.4 
gevent==1.0.1 
gevent-socketio==0.3.6 
gevent-websocket==0.9.3 
greenlet==0.4.2 
ipython==2.1.0 
itsdangerous==0.24 
pyreadline==2.0 

和運行venv/bin/pip freeze時,兩臺機器給出確切相同的包和版本。

順便說一句,我的application.py如下,雖然我不認爲它是問題的一部分,因爲它在我的第一臺機器上工作正常(是的,我知道它是馬虎,但它是一個實驗)。

from flask.ext.socketio import SocketIO, emit 
from flask import Flask, render_template, url_for, copy_current_request_context, request, session, redirect 
from random import random 
from time import sleep 
import json, pickle, os, binascii, pickler 

app = Flask(__name__) 
app.config['SECRET_KEY'] = binascii.b2a_hex(os.urandom(16)) 
app.config['DEBUG'] = True 
app.config['PICKLE_RESET'] = "KGxwMAou" 
app.config['BAD_NAMES'] = ["wg4568"] 
app.config['SECRET_PASSWORD'] = "thepassword" 

#turn the flask app into a socketio app 
socketio = SocketIO(app) 

class Reciever(): 
    def __init__(self): 
     self.messages = pickler.load("messages") 

    def send(self, user, message): 
     if len(message): 
      self.messages.insert(0, (user, message)) 
      pickler.save(self.messages, "messages") 
      socketio.emit('newmsg', {'content': message, 'user': user}, namespace='/msg') 
      return "Sent from " + user + " that reads, " + message 
     else: 
      return "Message was blank, not sent" 

    def render(self): 
#  if not session["VIEW"]: 
#   return '<p id="alert"><strong>' + self.messages[0][0] + ': </strong>' + self.messages[0][1] + '</p>' 
#  else: 
    if 1: 
      html = "" 
      for msg in self.messages[:session["VIEW"]]: 
       if msg[0] == "ALERT": 
        html += '<p id="alert"><strong>' + msg[0] + ': </strong>' + msg[1] + '</p>' 
       else: 
        html += '<p><strong>' + msg[0] + ': </strong>' + msg[1] + '</p>' 
      return html 

rec = Reciever() 

@app.before_request 
def before_request(): 
    try: session["VIEW"] 
    except KeyError: session["VIEW"] = 0 
    try: session["USERNAME"] 
    except KeyError: session["USERNAME"] = "AnonUser-" + binascii.b2a_hex(os.urandom(4)) 
# if not request.url.split("/")[-1:][0] == "send": 
#  rec.send("ALERT", session["USERNAME"] + " has joined the room") 

@app.route('/user_newid') 
def user_newid(): 
    session["USERNAME"] = "AnonUser-" + binascii.b2a_hex(os.urandom(4)) 
    return redirect("/") 

@app.route('/user_setid', methods=["POST"]) 
def user_setname(): 
    username = request.form["username"] 
    canbypass = False 
    if username.split("-")[-1:][0] == app.config["SECRET_PASSWORD"]: 
     canbypass = True 
     username = username.split("-")[0] 
    if not username in app.config['BAD_NAMES'] or canbypass: 
     session["USERNAME"] = username 
    return redirect("/") 

@app.route('/send', methods=["POST"]) 
def send(): 
    user = request.form["user"] 
    content = request.form["content"] 
    return rec.send(user, content) 

@app.route('/', methods=["GET", "POST"]) 
def index(): 
    if request.args.get("viewall"): session["VIEW"] += 10 
    else: session["VIEW"] = 0 
    print session["VIEW"] 
    return render_template('index.html', old=rec.render(), username=session["USERNAME"]) 

@socketio.on('connect', namespace='/msg') 
def test_connect(): 
    print('Client connected') 

@socketio.on('disconnect', namespace='/msg') 
def test_disconnect(): 
# rec.send("ALERT", session["USERNAME"] + " has left the room",) 
    print('Client disconnected') 


if __name__ == '__main__': 
    socketio.run(app, host="0.0.0.0") 

有沒有人有任何線索這裏發生了什麼,我完全難住。

+0

同樣的問題,我打升級gevevnt。 pip install -U gevent – CheStar

回答

相關問題