flask笔记:7:用户资料信息页和头像

用户信息页

创建一个新的视图函数 app/views.py

from app import app,db,lm,models
from flask import render_template,flash,redirect,url_for,session,request,g
from .forms import LoginForm
from .models import User
from flask.ext.login import login_user,logout_user,current_user,login_required

@lm.user_loader
def load_user(id):
    return User.query.get(int(id))

@app.before_request
def before_request():
    g.user = current_user

@app.route('/')
@app.route('/index')
@login_required
def index ():
    user=g.user
    posts=[
            {'author':{'nickname':'John'},
             'body':'Beautiful day in Portland!'},
            {'author':{'nickname':'Susan'},
             'body':'The Avengers movie was so cool!'}
           ]
    return render_template("index.html",
    title="Home",
    user=user,
    posts=posts)

@app.route('/login', methods = ['GET', 'POST'])
def login():
    if g.user is not None and g.user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        if models.User.query.filter_by(nickname=form.openid.data).first():
            user = User.query.filter_by(nickname=form.openid.data).first_or_404()
            login_user(user)
            return redirect(url_for('index'))
        else:
            return render_template('login.html',
        title = 'Sign In',
        error='[NO]',
        form = form)
    return render_template('login.html',
        title = 'Sign In',
        form = form)

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

@app.route('/user/<nickname>')
@login_required
def user(nickname):
    user=User.query.filter_by(nickname=nickname).first()
    if user==None:
        flash('user'+nickname+'not found!')
        return redirect(url_for('index'))
    posts=[
        {'author':user,'body':'Test post #1 !!!'},
        {'author':user,'body':'Test post #2 !!!'}
    ]
    return render_template('user.html',
        user=user,
        posts=posts
        )
#根据nickname区分用户,进入不同的用户界面

新增视图模板 app/templates/user.html

{% extends "base.html" %}
{% block content %}
<h1>User:{{user.nickname}} </h1>
<hr>
{% for post in posts %}
<p>
    {{post.author.nickname}} says:<b>{{post.body}}</b>
</p>
{% endfor %}
{% endblock %}

修改base模板 app/templates/base.html

<html>
    <head>
        {% if title%}
        <title>{{title}} - mybolg</title>
        {% else%}
        <title>Welcome - myblog</title>
        {% endif %}
    </head>
    <body>
        <div>MyBlog:<a href="/index">Home</a>
        {% if g.user.is_authenticated %}
        |<a href="{{url_for('user',nickname = g.user.nickname)}}">Your Profile</a>
        |<a href="{{url_for('logout')}}">Logout</a>
        {% endif %}
        </div>
        <hr>
        {% with messages = get_flashed_messages() %}
        {% if messages %}
        <ul>
            {% for message in messages %}
            <li>{{message}}</li>
            {% endfor %}
        </ul>
        {% endif %}
        {% endwith %}
        {% block content %}
        {% endblock %}
    </body>
</html>

#url_for( )可以加入参数

输入正确用户名

进入主页

点击用户页面进入,url中显示用户名

用户头像

在User类中添加头像位置,修改 app/models.py

from app import db
import os

sep=os.sep

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    nickname=db.Column(db.String(64),index=True,unique=True)
    email=db.Column(db.String(120),index=True,unique=True)
    posts=db.relationship('Post',backref='author',lazy='dynamic')

    def avatar(self,size):
        return sep+'static'+sep+'img'+sep+'1.jpg'+' width= '+size

    def is_authenticated (self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        try:
            return unicode(self.id)
        except NameError:
            return str(self.id)

    def __repr__(self):
        return '<User %r>'%(self.nickname)

class Post(db.Model):
    id=db.Column(db.Integer,primary_key=True)
    body=db.Column(db.String(140))
    timestamp=db.Column(db.DateTime)
    user_id=db.Column(db.Integer,db.ForeignKey('user.id'))
    def __repr__(self):
        return '<Post %r>'%(self.body)

#在User中自定义avatar( )头像函数,头像图片位置和大小

修改 app/templates/user.html

{% extends "base.html" %}
{% block content %}
<table>
    <tr valign='top'>
        <td><img src={{user.avatar('128')}}></td>
        <td><h1>User:{{user.nickname}} </h1></td>
    </tr>
</table>
<hr>
{% for post in posts %}
<table>
    <tr valign='top'>
        <td><img src={{user.avatar('50')}}></td>
        <td>{{post.author.nickname}}
        says:<br>{{post.body}}</td>
    </tr>
</table>
{% endfor %}
{% endblock %}

重用子模板

新建模板 app/templates/post.html

<table>
    <tr valign='top'>
        <td><img src={{user.avatar('50')}}></td>
        <td>{{post.author.nickname}}
        says:<br>{{post.body}}</td>
    </tr>
</table>

#user.avatar(‘50‘)头像和大小

修改user.html app/templates/user.html

{% extends "base.html" %}
{% block content %}
<table>
    <tr valign='top'>
        <td><img src={{user.avatar('128')}}></td>
        <td><h1>User:{{user.nickname}} </h1></td>
    </tr>
</table>
<hr>
{% for post in posts %}
{% include 'post.html' %}
{% endfor %}
{% endblock %}

#{% include ‘post.html‘ %} include 插入一个子模板

添加头像以后

用户简介

在模型类User中增加两个字段,最后登入时间 和 简介,修改 app/models.py

from app import db
import os

sep=os.sep

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    nickname=db.Column(db.String(64),index=True,unique=True)
    email=db.Column(db.String(120),index=True,unique=True)
    posts=db.relationship('Post',backref='author',lazy='dynamic')
    about_me=db.Column(db.String(140))
    last_seen=db.Column(db.DateTime)

    def avatar(self,size):
        return sep+'static'+sep+'img'+sep+'1.jpg'+' width= '+size

    def is_authenticated (self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        try:
            return unicode(self.id)
        except NameError:
            return str(self.id)

    def __repr__(self):
        return '<User %r>'%(self.nickname)

class Post(db.Model):
    id=db.Column(db.Integer,primary_key=True)
    body=db.Column(db.String(140))
    timestamp=db.Column(db.DateTime)
    user_id=db.Column(db.Integer,db.ForeignKey('user.id'))
    def __repr__(self):
        return '<Post %r>'%(self.body)

#新增字段以后,因为没有数据迁移的功能所以要删掉db文件重新建表和加数据

因为要编辑简介所以要form,修改 app/forms.py

from flask.ext.wtf import Form
from wtforms import StringField,BooleanField,TextAreaField
from wtforms .validators import DataRequired,Length

class LoginForm(Form):
    openid=StringField('openid',validators=[DataRequired()])
    remember_me=BooleanField('remember_me',default=False)

class EditForm(Form):
    nickname=StringField('nickname',validators=[DataRequired()])
    about_me=TextAreaField('about_me',validators=[Length(min=0,max=140)])
#TextAreaField( )是多行文本输入
#validators=[Length(min=0,max=140)],validators过滤器,输入最小0,最大140

新增个人简介编辑页面 app/edit.html

{% extends "base.html" %}
{% block content %}
<h1>Edit Your Prfile</h1>
<form action="" method="post" name="edit">
    {{ form.hidden_tag() }}
    <table>
        <tr>
            <td>Your nickname:</td>
            <td>{{form.nickname(size=24)}}</td>
        </tr>
        <tr>
            <td>About yourself:</td>
            <td>{{form.about_me(cols=32,rows=4)}}</td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Save Changes"></td>
        </tr>
    </table>
</form>
{% endblock %}

#form.about_me(cols=32,rows=4),设置多文本输入框的宽32,高4

#form.nickname(size=24) 输入框大小24

添加视图处理函数,修改 app/views.py

from app import app,db,lm,models
from flask import render_template,flash,redirect,url_for,session,request,g
from .forms import LoginForm, EditForm
from .models import User
from flask.ext.login import login_user,logout_user,current_user,login_required
from datetime import datetime

@lm.user_loader
def load_user(id):
    return User.query.get(int(id))

@app.before_request
def before_request():
    g.user = current_user
    if g.user.is_authenticated:
        g.user.last_seen=datetime.utcnow()
        db.session.add(g.user)
        db.session.commit()

@app.route('/')
@app.route('/index')
@login_required
def index ():
    user=g.user
    posts=[
            {'author':{'nickname':'John'},
             'body':'Beautiful day in Portland!'},
            {'author':{'nickname':'Susan'},
             'body':'The Avengers movie was so cool!'}
           ]
    return render_template("index.html",
    title="Home",
    user=user,
    posts=posts)

@app.route('/login', methods = ['GET', 'POST'])
def login():
    if g.user is not None and g.user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        if models.User.query.filter_by(nickname=form.openid.data).first():
            user = User.query.filter_by(nickname=form.openid.data).first_or_404()
            login_user(user)
            return redirect(url_for('index'))
        else:
            return render_template('login.html',
        title = 'Sign In',
        error='[NO]',
        form = form)
    return render_template('login.html',
        title = 'Sign In',
        form = form)

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

@app.route('/user/<nickname>')
@login_required
def user(nickname):
    user=User.query.filter_by(nickname=nickname).first()
    if user==None:
        flash('user'+nickname+'not found!')
        return redirect(url_for('index'))
    posts=[
        {'author':user,'body':'Test post #1 !!!'},
        {'author':user,'body':'Test post #2 !!!'}
    ]
    return render_template('user.html',
        user=user,
        posts=posts
        )

@app.route('/edit',methods=["POST","GET"])
@login_required
def edit():
    form=EditForm()
    if form.validate_on_submit():
        g.user.nickname=form.nickname.data
        g.user.about_me=form.about_me.data
        db.session.add(g.user)
        db.session.commit()
        flash('Your changes have been saved!')
        return redirect(url_for('edit'))
    else:
        form.nickname.data=g.user.nickname
        form.about_me.data=g.user.about_me
    return render_template('edit.html',form=form)

#修改简介,当submit提交以后将修改的用户名和简介添加进数据库里

点击Edit进入简介页面

用户名从数据库里读取

数据库里nickname还是john,about_me是空

修改用户名,添加简介以后会出现flash信息

再看数据库里用户名被修改,简介被添加

点击个人页面会发现,用户名被修改,简介已经添加

以上就完成了个人信息编辑展现页面,不过有点不习惯的问题

1:编辑完成后还在编辑页面,我觉得跳转到用户页面比较好

2:简介内容不能保持原始输入格式

第一个问题解决方式,修改 app/views.py

@app.route('/edit',methods=["POST","GET"])
@login_required
def edit():
    form=EditForm()
    if form.validate_on_submit():
        g.user.nickname=form.nickname.data
        g.user.about_me=form.about_me.data
        db.session.add(g.user)
        db.session.commit()
        flash('Your changes have been saved!')
        return redirect(url_for('user',nickname=g.user.nickname))
    else:
        form.nickname.data=g.user.nickname
        form.about_me.data=g.user.about_me
    return render_template('edit.html',form=form)

#修改edit函数的跳转,将原来跳转到edit,改成调到user+nickname的用户页面

第二个问题解决方式

{% extends "base.html" %}
{% block content %}
<table>
    <tr valign='top'>
        <td><img src={{user.avatar('128')}}></td>
        <td>
            <h1>User:{{user.nickname}} </h1>
            {% if user.about_me %}<pre>{{user.about_me}}</pre>{% endif %}
            {% if user.last_seen %}<p><i>Last seen on:{{user.last_seen}}</i></p>{% endif %}
            {% if user.id==g.user.id %}<p><a href="{{url_for('edit')}}">Edit</a></p>{% endif %}
        </td>
    </tr>
</table>
<hr>
{% for post in posts %}
{% include 'post.html' %}
{% endfor %}
{% endblock %}

#将用户展示页面上简介展示的标签由<p></p>改成<pre></pre>

时间: 2024-11-10 11:09:39

flask笔记:7:用户资料信息页和头像的相关文章

Flask Web 开发 用户资料_3

继续上一章节,上一章节讲的是用户编辑自己页面的内容,内容也是相对简单,真实姓名,来自哪里,自我介绍的信息,而email和用户名什么的,你自己也没地方改,因为在注册的时候就登记了. 但是作为网站管理者,你肯定需要拥有权限可以修改用户的资料,甚至说是为他们修改email的地址,或者是用户名,还有权限 别看只是多做一个修改他人用户信息的表单,这个章节里面有几个知识点需要特别注意 进入正题,既然可以修改的内容多了,那么我们肯定要新建一个表单,作为ADMIN可以看到并修改的表单 class EditPro

Flask学习之六 个人资料和头像

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/profile.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-vi-profile-page-

iOS微博项目(六)实现左滑,大图,用户资料页

1.左滑返回到nav的第一页 2.大图模式 3.登陆刷新tableview 4. 用户资料页 有时候为什么连线连不起呢,是因为file owner的class没有选择对应的类 4.1 微博接口升级后,不能看到关注数粉丝数,指定用户的微博等了. 4.2 点击@用户名进入资料页 4.3 点击头像进入资料页,只加了首页,没加正文

[Linux学习笔记] Linux常用命令 - 用户版本信息查看

用户版本信息查看 1. 查看当前系统用户登录信息: who 命令名称: who 命令所在路径: /usr/bin/who 执行权限: 所有用户 语法: who 功能描述: 查看当前系统用户登录信息 补充: w命令提供了较who命令更强大的功能 2. 查看当前用户身份: whoami 命令名称: whoami 命令所在路径: /usr/bin/whoami 执行权限: 所有用户 语法: whoami 功能描述: 查看当前用户身份 3. 查看系统版本信息: uname 命令名称: uname 命令所

解决Discuz“完善用户资料”任务不能完成的问题

最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没有填写. 到官方论坛去寻求解决方案,没有找到一个明确的答复,很多人遇到这样的问题,或者标明了已解决却没有提供解决方案,结合度娘给出的一些知识,最终自己摸索出了两种方法. 方案一: "后台→用户→用户栏目→栏目列表"中将真实姓名选中,并选中在资料页中显示: "后台→用户→用户栏目→

Java 用户资料完整度的前端显示(思路)

序 经常上网的人都会很熟悉今天的这个主题,怎么说呢,用户资料,是在我们注册一个网站的时候,需要注册人填写的一些个人信息,这些个人信息会经过加密处理后存储到不同的服务器.那么完整度是什么呢?显而易见,完整度就是网站列出的条目,以及注册人填写的资料的条目的对比度,用户填写了几条,还有几条没有填写(这里只是有效数据).可以通过这个完整度让用户一目了然,完善自己的用户资料. 背景 简单说一下背景,近几天,公司的设计部给提了几个新的需求,当然,这就是其中的一个(要不也就不在这废话了(*^__^*) 嘻嘻)

【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料

由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交流.学习和参考,博主只求能和大家共同进步.希望能多多支持! 这篇文章中,我们使用到了Share SDK,它是为iOS.Android.WP8的APP提供社会化功能的一个组件,目前支持如QQ.微信.新浪微博.腾讯微博.开心网.人人网.豆瓣.网易微博.搜狐微博.facebook.twitter.googl

利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :崔庆才 本节分享一下爬取知乎用户所有用户信息的 Scrapy 爬虫实战. 本节目标 本节要实现的内容有: 从一个大V用户开始,通过递归抓取粉丝列表和关注列表,实现知乎所有用户的详细信息的抓取. 将抓取到的结果存储到 MongoDB,并进行去重操作. 思路分析 我们都知道每个人都有关注列表和粉丝列表,尤其对于大V来说,粉丝和关注尤其更多. 如果我们从一个大V开始,首先可以获取他的个人信息,然后我们获取

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 本次示例的源码下载:点击下载 Flask-Login 库的中文文档:点击进入 Flask-Login 库的新版英文文档:点击进入 一.导入并初始化 Flask-Login 库 在项目根目录下的/demo/__init__.py 文件的头部,import 进 flask_login 库 from flask_login imp