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.pyFrom 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.pyFrom 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.pyFrom 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.pyFrom 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