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

2024-08-27 05:48

本文主要是介绍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.userposts=[{'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 ossep=os.sepclass 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= '+sizedef is_authenticated (self):return Truedef is_active(self):return Truedef is_anonymous(self):return Falsedef 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 ossep=os.sepclass 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= '+sizedef is_authenticated (self):return Truedef is_active(self):return Truedef is_anonymous(self):return Falsedef 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,Lengthclass 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_userif 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.userposts=[{'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.datag.user.about_me=form.about_me.datadb.session.add(g.user)db.session.commit()flash('Your changes have been saved!')return redirect(url_for('edit'))else:form.nickname.data=g.user.nicknameform.about_me.data=g.user.about_mereturn 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.datag.user.about_me=form.about_me.datadb.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.nicknameform.about_me.data=g.user.about_mereturn 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>


这篇关于flask笔记:7:用户资料信息页和头像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110813

相关文章

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二