从数据库获取VARCHAR(80)而不是昵称 [英] Getting VARCHAR(80) from db instead of nickname
本文介绍了从数据库获取VARCHAR(80)而不是昵称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用此处的代码使用Steam登录我的网站。我需要获得认证后的用户的用户名。我在HTML模板中有什么:
{%如果g.user被定义,g.user不是%}
{#用户已经登录#}
< li>您好,{{g.user.nickname}}!< / li>
< li>< a href =/ logout>注销< / a>< / li>
$ b $ {%else%}
{#用户未登录#}
< li>< a href =/ login>< input type = imagename =SignInvalue =SignInsrc =static / steam.png/>< / a>< / li>
{%endif%}
但是这会返回VARCHAR(80)而不是用户名。我的错误是什么?
编辑。这里是我提到的例子中的代码:
from flask import Flask,render_template,redirect,session,json,g,从flask_bootstrap导入引导
从flask.ext.sqlalchemy导入引导
从flask.ext.openid导入SQLAlchemy
导入OpenID
导入urllib
导入re
app = Flask(__ name__)
app.secret_key ='A0Zr98j / 3yX R〜XHH!jmN] LWX /,?RT'
Bootstrap(app)
app.config.from_pyfile ('settings.cfg')
db = SQLAlchemy(app)
oid = OpenID(app)
class User(db.Model):
id = db .Column(db.Integer,primary_key = True)
steam_id = db.Column(db.String(40))
nickname = db.String(80)
@staticmethod
def get_or_create(steam_id):
rv = User.query.filter_by(steam_id = steam_id).first()
如果rv是None:
rv = User()
rv.steam_id = steam_id
db.session.add(rv)
return rv
db。 create_all()
$ b $ def get_steam_userinfo(steam_id):
options = {$ b $ key':app.config ['STEAM_API_KEY'],
'steamids':steam_id
}
url ='http://api.steampowered.com/ISteamUser/'\
'GetPlayerSummaries / v0001 /?%s'%urllib.urlencode(options)
rv = json.load(urllib.urlopen(url))
return rv ['response'] ['players'] ['player'] [0]或{}
_steam_id_re = re.compile('steamcommunity.com/openid/id/(.*?)$')
@ app.route('/ login')
@ oid.loginhandler
def login():
如果g.user不是None:
return redirect(oid.get_next_url())
return oid.try_login('http://steamcommunity.com/ openid')
@ oid.after_login
def create_or_login(resp):
match = _steam_id_re.search(resp.identity_url)
g.user = User.get_or_create (match.group(1))
steamdata = get_steam_userinfo(g.user.steam_id)
g.user.n ickname = steamdata ['personaname']
db.session.commit()
session ['user_id'] = g.user.id
return redirect(oid.get_next_url())
@ app.before_request
def before_request():
g.user = None
如果会话中有'user_id':
g.user = User.query .get(session ['user_id'])
@ app.route('/')
def homepage():
return render_template('mainpage.html')
@ app.route('/ logout')
def logout():
session.pop('user_id',None)
return redirect(oid.get_next_url ())
if __name__ =='__main__':
app.run(debug = True)
$你没有定义 User.nickname
作为一个列,你刚刚分配了一个SQL键入它。
nickname = db.Column(db.String)
code>
I'm using code from here to Sign In my web-site using Steam. I need to get the username of the user after authentication. What I have in html template:
{% if g.user is defined and g.user is not none %}
{# User has logged in #}
<li>Hello, {{ g.user.nickname }}!</li>
<li><a href="/logout">Logout</a></li>
{% else %}
{# User has not logged in #}
<li><a href="/login"><input type="image" name="SignIn" value="SignIn" src="static/steam.png"/></a></li>
{% endif %}
But this returns VARCHAR(80) instead of the username. What's my mistake ?
EDIT. Here is the code from the example that I mentioned:
from flask import Flask, render_template, redirect, session, json, g, flash
from flask_bootstrap import Bootstrap
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.openid import OpenID
import urllib
import re
app = Flask(__name__)
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
Bootstrap(app)
app.config.from_pyfile('settings.cfg')
db = SQLAlchemy(app)
oid = OpenID(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
steam_id = db.Column(db.String(40))
nickname = db.String(80)
@staticmethod
def get_or_create(steam_id):
rv = User.query.filter_by(steam_id=steam_id).first()
if rv is None:
rv = User()
rv.steam_id = steam_id
db.session.add(rv)
return rv
db.create_all()
def get_steam_userinfo(steam_id):
options = {
'key': app.config['STEAM_API_KEY'],
'steamids': steam_id
}
url = 'http://api.steampowered.com/ISteamUser/' \
'GetPlayerSummaries/v0001/?%s' % urllib.urlencode(options)
rv = json.load(urllib.urlopen(url))
return rv['response']['players']['player'][0] or {}
_steam_id_re = re.compile('steamcommunity.com/openid/id/(.*?)$')
@app.route('/login')
@oid.loginhandler
def login():
if g.user is not None:
return redirect(oid.get_next_url())
return oid.try_login('http://steamcommunity.com/openid')
@oid.after_login
def create_or_login(resp):
match = _steam_id_re.search(resp.identity_url)
g.user = User.get_or_create(match.group(1))
steamdata = get_steam_userinfo(g.user.steam_id)
g.user.nickname = steamdata['personaname']
db.session.commit()
session['user_id'] = g.user.id
return redirect(oid.get_next_url())
@app.before_request
def before_request():
g.user = None
if 'user_id' in session:
g.user = User.query.get(session['user_id'])
@app.route('/')
def homepage():
return render_template('mainpage.html')
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(oid.get_next_url())
if __name__ == '__main__':
app.run(debug=True)
解决方案
You didn't define User.nickname
as a column, you just assigned a SQL type to it. Change it to be a column with that type.
nickname = db.Column(db.String)
这篇关于从数据库获取VARCHAR(80)而不是昵称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文