Flask Notes: 7: User profile Information page and Avatar

Source: Internet
Author: User

User Information pageCreate a new view function app/views.py
From app import app,db,lm,modelsfrom Flask import render_template,flash,redirect,url_for,session,request,gfrom. Forms Import Loginformfrom. Models import userfrom flask.ext.login import Login_user,logout_user,current_user,login_ Required@lm.user_loaderdef Load_user (ID): Return User.query.get (int (id)) @app. Before_requestdef before_request (): G. user = Current_user@app.route ('/') @app. Route ('/index ') @login_requireddef 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 = [' G    ET ', ' 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 () L        Ogin_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_requireddef logout (): Logout_user () return Redirect (Url_fo R (' index ')) @app. Route ('/user/<nickname> ') @login_requireddef 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区分用户, enter a different user interface



New View Template app/templates/user.html
{% extends "base.html"%} {% block content%}


Modify the base template app/templates/base.html  

#url_for () can add parameters
Enter the correct user name

Go to homepage

Click on the user page to enter, the URL to display the user name

User Pictureadd avatar position in the user class, modify app/models.py
From app import Dbimport Ossep=os.sepclass User (db. Model): id = db. Column (db. Integer,primary_key=true) nickname=db. Column (db. String (+), index=true,unique=true) email=db. Column (db. String (+), 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 Tru E def is_active (self): return True def is_anonymous (self): return False def-get_id (self): TR Y: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 (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 () Avatar function, avatar picture position and size
Modify App/templates/user.html
{% extends "base.html"%} {% block content%}<table>    <tr valign= ' top ' >        <td> </td>        <td>



Reusing child templatesNew Template app/templates/post.html
<table>    <tr valign= ' top ' >        <td></td>        <td>{{post.author.nickname}}        says:<br>{{post.body}}</td>    </tr></table>


#user. Avatar (' 50 ') Avatar and size
Modify user.html app/templates/user.html
{% extends "base.html"%} {% block content%}<table>    <tr valign= ' top ' >        <td> </td>        <td>


#{% include ' post.html '%} include insert a child template
After you add your avatar


User Profileadd two fields to the Model class user, last login time and introduction, modify app/models.py
From app import Dbimport Ossep=os.sepclass User (db. Model): id = db. Column (db. Integer,primary_key=true) nickname=db. Column (db. String (+), index=true,unique=true) email=db. Column (db. String (+), index=true,unique=true) posts=db.relationship (' Post ', backref= ' author ', lazy= ' dynamic ') about_me=db. Column (db. String (LAST_SEEN=DB). Column (db. DateTime) def Avatar (self,size): Return sep+ ' static ' +sep+ ' img ' +sep+ ' 1.jpg ' + ' width= ' +size def is_authenticat    Ed (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 (SE lf.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 (TIMESTAMP=DB). Column (db. DateTime) user_id=db. Column (db. Integer,db. ForeignKey (' user.id ') def __Repr__ (self): return ' <post%r> '% (self.body) 


#新增字段以后, because there is no data migration function, so delete the db file to re-build the table and add data
because you want to edit the profile, you want to change the app/forms.py
From FLASK.EXT.WTF import formfrom wtforms import stringfield,booleanfield,textareafieldfrom 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 () is a multiline text input #validators=[length (min=0,max=140)],validators filter, input min 0, max 140



New Profile Edit Page app/edit.html
{% extends "base.html"%} {% block content%}


#form. About_me (cols=32,rows=4), set the width of the multi-text input box 32, 4 higher#form. Nickname (size=24) input box size
Add View handler function, modify app/views.py
From app import app,db,lm,modelsfrom Flask import render_template,flash,redirect,url_for,session,request,gfrom. Forms Import LoginForm, Editformfrom models import userfrom flask.ext.login import Login_user,logout_user,current_user, Login_requiredfrom datetime import datetime@lm.user_loaderdef load_user (ID): Return User.query.get (int (id)) @ App.before_requestdef before_request (): G.user = Current_User if G.user.is_authenticated:g.user.last_seen=da Tetime.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 Por           Tland! '}, {' author ': {' nickname ': ' Susan '}, ' body ': ' The Avengers movie is so cool! '} ] Return render_template ("index.html", title= "Home", User=user, Posts=posts) @app. Route ('/login ', methods = [' G ET ', ' 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 re Nder_template (' login.html ', title = ' Sign in ', error= ' [NO] ', form = form) return Render_template (' Login.html ', title = ' Sign in ', form = form) @app. Route ('/logout ') @login_requireddef logout (): Logout_user () return redirect (Url_for (' index ')) @app. Route ('/user/<nickname> ') @login_requireddef 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_requireddef 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)


#修改简介, the modified user name and profile are added to the database when submit is submitted
Click Edit to go to the introduction page

user name read from database
in the database, nickname or John,about_me is empty.

Modify the user name, add the introduction will appear flash information
look at the database, the user name is modified, the introduction is added

Click on the personal page will find that the user name has been modified, the introduction has been added

The above to complete the personal Information editing display page, but a bit not used to the problem1: Editing after the completion of the page, I think it is better to jump to the user page2: Introduction content cannot maintain original input format
The first problem solving method, modify app/views.py
@app. Route ('/edit ', methods=["POST", "GET"]) @login_requireddef 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函数的跳转, the original jump to edit, changed to User+nickname user page
The second problem solving method
{% extends "base.html"%} {% block content%}<table>    <tr valign= ' top ' >        <td> </td>        <td>            


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

Flask Notes: 7: User profile Information page and Avatar

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.