如何使用此 Python 代码获取当前登录用户的名称?

How can one obtain the name of the currently logged-in user with this Python code?

当然,我讨厌利用繁忙的 StackExchange 成员的时间来解决我的问题,但我已经在我检索此代码的论坛中询问过该机制是如何工作的,但绝对没有响应。

我的问题应该很简单(不是针对我自己,因为我是所谓的网络开发业余爱好者)。我有这个代码(不是我自己的)用于后端一个基本的博客。但是有一件事我不太明白。在其中一个 HTML 文件中,有一行 {{user.name}},它获取当前登录用户的用户名并将其张贴在页面的一角。 {{}} 只是 Jinja2 语法,它向模板打印一个 python 表达式(或者有人告诉我)。

如何获取在 Python 文件中登录的用户的用户名?我目前在自己的 Web 应用程序中尝试做的是获取登录用户的用户名并查询 Google 数据存储以获取有关用户的信息并将其放入个人资料页面,如下所示:

class Profile(BlogHandler):
    def render_profile(self):
        signatory = user.name
        signedevents = db.GqlQuery("SELECT event FROM Signatories WHERE username IN (signatory)")
        self.render("profile.html", signedevents=signedevents)
    def get(self):
        if self.user:
            self.render_profile()
        else:
            self.redirect('/')

但是每当我尝试这样做时,我总是会出错。有没有其他东西可以代替 user.name

博客代码(我确定答案在 Handler 的某处 class 但我根本无法弄清楚问题是什么):

import os
import re
import random
import hashlib
import hmac
from string import letters

import webapp2
import jinja2

from google.appengine.ext import db

template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
                               autoescape = True)

secret = 'fart'

def render_str(template, **params):
    t = jinja_env.get_template(template)
    return t.render(params)

def make_secure_val(val):
    return '%s|%s' % (val, hmac.new(secret, val).hexdigest())

def check_secure_val(secure_val):
    val = secure_val.split('|')[0]
    if secure_val == make_secure_val(val):
        return val

class BlogHandler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)

    def render_str(self, template, **params):
        params['user'] = self.user
        return render_str(template, **params)

    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

    def set_secure_cookie(self, name, val):
        cookie_val = make_secure_val(val)
        self.response.headers.add_header(
            'Set-Cookie',
            '%s=%s; Path=/' % (name, cookie_val))

    def read_secure_cookie(self, name):
        cookie_val = self.request.cookies.get(name)
        return cookie_val and check_secure_val(cookie_val)

    def login(self, user):
        self.set_secure_cookie('user_id', str(user.key().id()))

    def logout(self):
        self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')

    def initialize(self, *a, **kw):
        webapp2.RequestHandler.initialize(self, *a, **kw)
        uid = self.read_secure_cookie('user_id')
        self.user = uid and User.by_id(int(uid))

def render_post(response, post):
    response.out.write('<b>' + post.subject + '</b><br>')
    response.out.write(post.content)

class MainPage(BlogHandler):
  def get(self):
      self.write('Hello, Udacity!')


##### user stuff
def make_salt(length = 5):
    return ''.join(random.choice(letters) for x in xrange(length))

def make_pw_hash(name, pw, salt = None):
    if not salt:
        salt = make_salt()
    h = hashlib.sha256(name + pw + salt).hexdigest()
    return '%s,%s' % (salt, h)

def valid_pw(name, password, h):
    salt = h.split(',')[0]
    return h == make_pw_hash(name, password, salt)

def users_key(group = 'default'):
    return db.Key.from_path('users', group)

class User(db.Model):
    name = db.StringProperty(required = True)
    pw_hash = db.StringProperty(required = True)
    email = db.StringProperty()

    @classmethod
    def by_id(cls, uid):
        return User.get_by_id(uid, parent = users_key())

    @classmethod
    def by_name(cls, name):
        u = User.all().filter('name =', name).get()
        return u

    @classmethod
    def register(cls, name, pw, email = None):
        pw_hash = make_pw_hash(name, pw)
        return User(parent = users_key(),
                    name = name,
                    pw_hash = pw_hash,
                    email = email)

    @classmethod
    def login(cls, name, pw):
        u = cls.by_name(name)
        if u and valid_pw(name, pw, u.pw_hash):
            return u

这里的一切可能都不重要,但如果仅使用上面的代码无法找到答案,请继续。

##### blog stuff

def blog_key(name = 'default'):
    return db.Key.from_path('blogs', name)

class Post(db.Model):
    subject = db.StringProperty(required = True)
    content = db.TextProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)
    last_modified = db.DateTimeProperty(auto_now = True)

    def render(self):
        self._render_text = self.content.replace('\n', '<br>')
        return render_str("post.html", p = self)

class BlogFront(BlogHandler):
    def get(self):
        posts = greetings = Post.all().order('-created')
        self.render('front.html', posts = posts)

class PostPage(BlogHandler):
    def get(self, post_id):
        key = db.Key.from_path('Post', int(post_id), parent=blog_key())
        post = db.get(key)

        if not post:
            self.error(404)
            return

        self.render("permalink.html", post = post)

class NewPost(BlogHandler):
    def get(self):
        if self.user:
            self.render("newpost.html")
        else:
            self.redirect("/login")

    def post(self):
        if not self.user:
            self.redirect('/blog')

        subject = self.request.get('subject')
        content = self.request.get('content')

        if subject and content:
            p = Post(parent = blog_key(), subject = subject, content = content)
            p.put()
            self.redirect('/blog/%s' % str(p.key().id()))
        else:
            error = "subject and content, please!"
            self.render("newpost.html", subject=subject, content=content, error=error)


###### Unit 2 HW's
class Rot13(BlogHandler):
    def get(self):
        self.render('rot13-form.html')

    def post(self):
        rot13 = ''
        text = self.request.get('text')
        if text:
            rot13 = text.encode('rot13')

        self.render('rot13-form.html', text = rot13)


USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
    return username and USER_RE.match(username)

PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
    return password and PASS_RE.match(password)

EMAIL_RE  = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
def valid_email(email):
    return not email or EMAIL_RE.match(email)

class Signup(BlogHandler):
    def get(self):
        self.render("signup-form.html")

    def post(self):
        have_error = False
        self.username = self.request.get('username')
        self.password = self.request.get('password')
        self.verify = self.request.get('verify')
        self.email = self.request.get('email')

        params = dict(username = self.username,
                      email = self.email)

        if not valid_username(self.username):
            params['error_username'] = "That's not a valid username."
            have_error = True

        if not valid_password(self.password):
            params['error_password'] = "That wasn't a valid password."
            have_error = True
        elif self.password != self.verify:
            params['error_verify'] = "Your passwords didn't match."
            have_error = True

        if not valid_email(self.email):
            params['error_email'] = "That's not a valid email."
            have_error = True

        if have_error:
            self.render('signup-form.html', **params)
        else:
            self.done()

    def done(self, *a, **kw):
        raise NotImplementedError

class Unit2Signup(Signup):
    def done(self):
        self.redirect('/unit2/welcome?username=' + self.username)

class Register(Signup):
    def done(self):
        #make sure the user doesn't already exist
        u = User.by_name(self.username)
        if u:
            msg = 'That user already exists.'
            self.render('signup-form.html', error_username = msg)
        else:
            u = User.register(self.username, self.password, self.email)
            u.put()

            self.login(u)
            self.redirect('/blog')

class Login(BlogHandler):
    def get(self):
        self.render('login-form.html')

    def post(self):
        username = self.request.get('username')
        password = self.request.get('password')

        u = User.login(username, password)
        if u:
            self.login(u)
            self.redirect('/blog')
        else:
            msg = 'Invalid login'
            self.render('login-form.html', error = msg)

class Logout(BlogHandler):
    def get(self):
        self.logout()
        self.redirect('/blog')

class Unit3Welcome(BlogHandler):
    def get(self):
        if self.user:
            self.render('welcome.html', username = self.user.name)
        else:
            self.redirect('/signup')

class Welcome(BlogHandler):
    def get(self):
        username = self.request.get('username')
        if valid_username(username):
            self.render('welcome.html', username = username)
        else:
            self.redirect('/unit2/signup')

app = webapp2.WSGIApplication([('/', MainPage),
                               ('/unit2/rot13', Rot13),
                               ('/unit2/signup', Unit2Signup),
                               ('/unit2/welcome', Welcome),
                               ('/blog/?', BlogFront),
                               ('/blog/([0-9]+)', PostPage),
                               ('/blog/newpost', NewPost),
                               ('/signup', Register),
                               ('/login', Login),
                               ('/logout', Logout),
                               ('/unit3/welcome', Unit3Welcome),
                               ],
                              debug=True)

如果有什么需要我澄清的,请告诉我。预先感谢您的帮助。

好的,您将继承 BlogHandler

要获取用户名信息,按照 Unit3Welcome() 示例,我认为您需要将 signatory = user.name 更改为 signatory = self.user.name

要填充 jinja2 模板中的 {{user.name}} 字段,它需要获取模板值 dict 它接收一个 user 变量(也是 dict 类型)包含一个 name 键(大概有相应的用户名)。例如:{'user': {'name': 'johndoe'}}.

我既不熟悉您使用的渲染器的工作原理,也不熟悉 SQL 以及 signedevents 的填充方式,因此您可能需要适应。

为了轻松检查(以调试打印样式)实际上是什么进入了模板,您可以在 html 的某处临时插入这样的段落:<p>user: ({{ user }})</p> 并且您应该得到转储user 变量就在你的浏览器中:)

您好,我记得这件事与 App Engine 有关,也许它与旧的 'db' 数据存储区有关。 Google 现在建议使用 'ndb'。 由于您还设置了 cookie,因此您实际上可以使用它在欢迎页面中呈现您的用户名。

我就是这样解决的,希望对您有所帮助。

class Register(SignUp):
    def done(self):
        #make sure the user doesn't already exist
        u = User.by_name(self.request.get("username"))
        if u:
            msg = 'That user already exists.'
            self.render('signup-form.html', username_exists = msg)
        else:
            username = self.request.get("username")
            password = self.request.get("password")
            email = self.request.get("email")

            u = User.register(username, password , email)
            u.put()
            self.login(u)
            self.redirect('/blog/welcome')


class Welcome(BlogHandler):
    def get(self):        
        cookie = self.request.cookies.get("user_id")
        val = check_secure_val(cookie)
        u = User.by_id(int(val))

        if u:
            print u
            self.render('welcome.html', username = u.name)
        else:
            self.redirect('/blog/signup')