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