Python-NameError:name';协议SSLv3和x27;使用gevent时未定义

Python-NameError:name';协议SSLv3和x27;使用gevent时未定义,python,flask,socket.io,virtualenv,gevent,Python,Flask,Socket.io,Virtualenv,Gevent,因此,我在一台virtualenv(运行raspbian的raspberry pi)中的一台机器上安装了一个Flask应用程序,一切正常,但是当我将它移植到另一台同样运行raspbian的raspberry pi,并按照完全相同的规格设置了一个新的virtualenv时,运行该应用程序会抛出以下问题: Flask应用程序是一个socket io聊天应用程序,它使用ajax之类的东西 Traceback (most recent call last): File "application.py",

因此,我在一台virtualenv(运行raspbian的raspberry pi)中的一台机器上安装了一个Flask应用程序,一切正常,但是当我将它移植到另一台同样运行raspbian的raspberry pi,并按照完全相同的规格设置了一个新的virtualenv时,运行该应用程序会抛出以下问题:

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
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如下所示,尽管我不认为这是问题的一部分,因为它在我的第一台机器上运行良好(是的,我知道它很草率,但这是一个实验)

从flask.ext.socketio导入socketio,发射
从flask导入flask,呈现模板,url,复制当前请求上下文,请求,会话,重定向
从随机导入随机
从时间上导入睡眠
导入json、pickle、os、binascii、pickler
app=烧瓶(名称)
app.config['SECRET_KEY']=binascii.b2a_hex(os.uradom(16))
app.config['DEBUG']=True
app.config['PICKLE_RESET']=“KGxwMAou”
app.config['BAD_NAMES']=[“wg4568”]
app.config['SECRET\u PASSWORD']=“密码”
#将烧瓶应用程序转换为socketio应用程序
socketio=socketio(应用程序)
类receiver():
定义初始化(自):
self.messages=pickler.load(“消息”)
def发送(自我、用户、消息):
如果是len(信息):
self.messages.insert(0,(用户,消息))
pickler.save(self.messages,“messages”)
emit('newmsg',{'content':消息,'user':user},命名空间='/msg')
返回“从”+用户+”发送的,内容为“+消息”
其他:
return“消息为空,未发送”
def渲染(自):
#如果不是会话[“查看”]:
#返回'

'+self.messages[0][0]+':'+self.messages[0][1]+'

' #其他: 如果1: html=“” 对于self.messages[:session[“VIEW”]]中的消息: 如果消息[0]=“警报”: html+='

'+msg[0]+':'+msg[1]+'

' 其他: html+=''+msg[0]+':'+msg[1]+'

' 返回html rec=接收器() @请求前的应用程序 请求前定义(): 尝试:会话[“查看”] KeyError除外:会话[“视图”]=0 尝试:会话[“用户名”] 除了KeyError:session[“USERNAME”]=“AnonUser-”+binascii.b2a_hex(os.uradom(4)) #如果不是请求.url.split(“/”[-1:[0]==“发送”: #rec.send(“警报”,会话[“用户名”]+“已加入会议室”) @app.route(“/user\u newid”) def user_newid(): 会话[“USERNAME”]=“AnonUser-”+binascii.b2a_hex(os.uradom(4)) 返回重定向(“/”) @app.route('/user_setid',methods=[“POST”]) def user_setname(): 用户名=请求。表单[“用户名”] canbypass=False 如果username.split(“-”[-1:[0]==app.config[“SECRET\u PASSWORD”]: canbypass=True 用户名=用户名。拆分(“-”[0] 如果不是app.config['BAD_NAMES']中的用户名或canbypass: 会话[“用户名”]=用户名 返回重定向(“/”) @app.route('/send',methods=[“POST”]) def send(): 用户=请求。表单[“用户”] 内容=请求。表格[“内容”] return rec.send(用户、内容) @app.route('/',methods=[“GET”,“POST”]) def index(): if request.args.get(“viewall”):会话[“视图”]+=10 其他:会话[“视图”]=0 打印会话[“查看”] 返回render_模板('index.html',old=rec.render(),username=session[“username”]) @on('connect',namespace='/msg') def测试\u connect(): 打印('客户端已连接') @socketio.on('disconnect',namespace='/msg') def测试_断开() #rec.send(“警报”,会话[“用户名”]+“已离开房间”,) 打印('客户端已断开连接') 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': socketio.run(应用程序,host=“0.0.0.0”)

有人知道这里发生了什么事吗,我完全被难住了。

我通过替换PROTOCOL_SSLv3=PROTOCOL_SSLv23解决了这个问题,感谢mgogoulos的回答,链接到这里:

和我一样的问题,我升级了gevevnt。pip安装-U gevent
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
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")