从数据库获取VARCHAR(80)而不是昵称 [英] Getting VARCHAR(80) from db instead of nickname

查看:161
本文介绍了从数据库获取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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆