一、个人学期总结
本学期由杜云梅老师的带领下,我们学习了信息管理系统这一课程,体会较深,受益匪浅。在几个月的学习中,我们从初次接触的懵懵懂懂到后来基本熟练操作上机过程,都离不开老师一步一步的指导。每一节课上,老师都是每讲一个新的学习内容,我们就独立操作一次,并不会讲完全部再让我们去操作,这样我们能更快更好地理解和吸收。Python是一种相当高级的语言,完成一个任务,C语言需要写1000行代码,Java可能要写100行,而Python可能只要20行代码,并且内容相对通俗易懂,更容易入门,并且能实现的功能非常齐全,非常适合初次入门学习的我们。
本次学习历程可以分为前期传授理论并且有基础练习,中期解释代码原理和开始网页制作,后期是为网页增加色彩和功能。
前期:理论授课,了解Python的基本知识和功能。在这段时期里,我们学习了简单的算数计算。初次接触Python,我们首先了解输入及输出的代码写法,不同数据类型和变量的表达方式。然后学习turtle海龟库,在此环境中我们练习if条件、for循环、定义函数的代码,画出了同心圆、国旗,太阳花等等,首次感受到代码的神奇力量。接着我们学习了字符串的基本操作,凯撒密码,词频统计预处理,实现很多功能,如输入字符串的代码,输出文字或者星座等需要的内容;统计一篇文章中某些单词出现的次数,将大写转为小写等。还有,利用datetime显示日期和时间,理解数据存储方式如列表、元祖、字典和集合,这和我们主要学习的web制作息息相关。
中期:了解代码原理,开始网页的制作。首先,我们认识html是使用标记标签来描述网页,观察网站的审查元素,学会区分各组成部分;然后用标签制作HTML页面内容,定义唯一的id,<link>定义了一一个文档和外部资源之间的关系,能链接图片和跳转到其他网站;<nav>标签定义导航链接的部分;还学习了如何使用样式美化html页面,分别是行内样式表、内嵌样式表和外部样式表。PyCharm中通过使用CSS类选择器控制多重网页的样式和布局。使用JS文件进行登录注册条件设置,如用户名首字母不能为数字,两次密码是否一致等等,另外还利用Bootstrap自定义导航条的样式,能方便快捷地美化网页样式。虽然初步制作网页并没有官方网页做的美观耐看,但能把学习的知识运用其中并展现出来,是这一课程大大的进步啊。
后期:美化网页,添加网页其他功能。在PyCharm中开始py文件的学习,加载静态文件,父模板的继承与扩展,数据库的连接和使用,创建用户模型(制作表和定义属性—字段),在py文件中使用def定义功能,区分GET(用于获取、查询资源信息)和POST(用于更新资源信息)的方法;在注册功能中,在网页上添加的数据放入session中,自动存入cookie并返回登录页面,而在登录功能中,用上下文处理定义函数,输入的数据发送到cookie中读取session,再从session中读取数据,最后在父模板更新导航。接着创建问答和评论表,首页中的列表显示全部问答,问答详情中完成布局并发布评论,问答及评论列表显示时间并且排序,实现网页内容和标题的搜索功能。值得一提的是个人中心部分,首先运用ul标签定义无序列表,制作标签页导航并作为个人中心的父模板,然后再制作三个子页面分别是全部问答、全部评论和个人资料作为子模板连接到个人中心,使用定义的user_id传输数据,更新个人中心的每一个子页面信息。还有实现了加密功能,在数据库中其他用户只能看到密文,只有个人才清楚明文密码,能够起到密码保护的作用。这个过程中我能基本实现网页的基础功能,但要更加完善,不能止步不前,学会将代码原理融会贯通。
二、Python+Flask+MysqL的web建设技术过程总结
初学者的简单建议;
(1)在比较官方的网站看教程,并且把其中的例子多练习,反复敲打,这样能更好地学习代码的原理。
(2)找一个真实的项目,为的是多写代码。例如本课程的学习,参考官方网站的功能,不能完全复制,最好制作一个属于自己的项目。
总结:
以前觉得编程很无趣,对计算机语言很陌生,但学习完信息管理系统这一门课程后,我还是能找到其中的乐趣,并没有太过于枯燥无味。我在实现各种功能的过程中并不是一帆风顺的,期间也遇到过很多细小的错误,不仅靠自己去百度知乎网上搜索解决方法,在项目中一次次不懈努力的尝试,而且更多的是不耻下问,因为有老师和同学的帮助和解答,让我更有效率的完成作业,所以,不存在解决不了的问题,关键在你对这个解决问题的上心程度和决心。每次因为成功实现一个功能或解决掉一个小错误而会感到开心和满足,看到自己努力和坚持的结果,这是日后学习Python的动力源泉。“编程是一门活艺术”,以后我一定会多练习和探究,将代码原理理解透彻,学会融会贯通,让自己在编程方面更上一层楼。最后感谢杜云梅老师的一个学期的淳淳教诲,希望以后能有机会在你的教导下学到更多知识。
下面是本人做的项目,实现了Python+Flask+MysqL的web建设,由于是新手,如有错漏欢迎老师和同学的指导。
1、使用工具
工具:pycharm64.exe + Python 3.6 64-bit + MySQL + Navicat for MySQL
3、第三方库导入、Flask初始概览与数据库链接
主py文件:
from flask import Flask, render_template, redirect, url_for,request,session from flask_sqlalchemy import SQLAlchemy from datetime import datetime from functools import wraps from sqlalchemy import or_,and_ import config from werkzeug.security import generate_password_hash,check_password_hash
config文件:数据库连接池
import os DEBUG = True SECRET_KEY = os.urandom(24) DLALECT = 'mysql' DRIVER = 'mysqldb' USERAME = 'root' PASSWORD = 'root' HOST = '127.0.0.1' DATABASE = 'mytest' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@127.0.0.1:3306/mis_db?charset=utf8' SQLALCHEMY_TRACK_MODIFICATIONS = False
app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) #创建用户模型 class User(db.Model): __table__name = 'user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(20),nullable=False) _password = db.Column(db.String(200),nullable=False) #内部使用 @property def password(self): #外部使用 return self._password @password.setter def password(self, row_password): self._password = generate_password_hash(row_password) def check_password(self, row_passwprd): result = check_password_hash(self._password, row_passwprd) return result class Question(db.Model): __tablename__ = 'question' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) detail = db.Column(db.Text, nullable=False) create_time = db.Column(db.DateTime, default=datetime.now) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) author = db.relationship('User', backref=db.backref('question')) class Comment(db.Model): __tablename__ = 'comment' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) question_id = db.Column(db.Integer, db.ForeignKey('question.id')) create_time = db.Column(db.DateTime, default=datetime.now) detail = db.Column(db.Text, nullable=False) question = db.relationship('Question',backref = db.backref('comments', order_by=create_time.desc)) author = db.relationship('User',backref = db.backref('comments')) db.create_all()
user表
question表
comment表
4、数据库增删查改功能
增加 user = User(username='qingting',password='123') db.session.add(user) db.session.commit() 查询 user = User.query.filter(User.username == 'qingting').first() print(user.username,user.password) 修改 user=User.query.filter(User.username == 'qingting').first() user.password=1234567 db.session.commit() 删除 user=User.query.filter(User.username == 'qingting').first() db.session.delete(user) db.session.commit()
5、加载静态文件、父模板继承
加载静态文件:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
继承父模板:
{% extends'base.html' %}
{% block title %}首页-{% endblock %}
{% block head %}{% endblock %}
6、首页功能
.py文件
#首页 @app.route('/') def index(): context = { 'questions' : Question.query.order_by('-create_time').all() } return render_template('index.html',**context)
html文件:
{% extends'base.html' %} {% block title %}首页-{% endblock %} {% block head %}{% endblock %} {% block main %} <style> body{ background-color: antiquewhite; } .footer{ bottom: 0; width: 100%; } div.img{ border: 1px solid #cccccc; width:100px; float: left; margin: 5px; } div.img img{ width: 100%; height: auto; } div,desc{ text-align: center; padding: 5px; } div,img:hover{ border: 1px solid #ffffff; } </style> <img src="{{ url_for('static',filename='images/问答.jpg') }}" alt="" width="100"> <p>{{ usern }}</p> {% for foo in questions %} <ul class="new-list"> <li> <p>{{ foo.detail }}</p> <a target="_self" href="{{ url_for('detail',question_id=foo.id) }}">标题:{{ foo.title }}</a><br> <a href="{{ url_for('usercenter',user_id = foo.author.id,tag = 1) }}">发布者:{{ foo.author.username }}<br></a> 评论:({{ foo.comments|length }})<br> <span class="post_item_foot"> 发布于 {{ foo.create_time }} </span> </li> </ul> </div> <hr></div> {% endfor %} {% block body %} <div> <div class="recommend"> <footer class="footer"> <div class="img"> <img src="{{ url_for('static',filename='images/pig1.jpg') }}" alt="" width="100"> <div class="desc"><a href="https://www.zhihu.com/question/264488033">真的笑 笑出声 </a></div> </div> <div class="img"> <img src="{{ url_for('static',filename='images/pig1.jpg') }}" alt="" width="100"> <div class="desc"><a href="https://www.zhihu.com/collection/70070923">很棒的答案。●▽●</a></div> </div> <div class="img"> <img src="{{ url_for('static',filename='images/pig1.jpg') }}" alt="" width="100"> <div class="desc"><a href="https://www.zhihu.com/collection/20355573">让世界变清晰的知识集</a></div> </div> <div class="img"> <img src="{{ url_for('static',filename='images/pig1.jpg') }}" alt="" width="100"> <div class="desc"><a href="https://www.zhihu.com/collection/156494396">读书最快乐</a></div> </div> </footer> </div> </div> {% endblock %} {% endblock %}
7、注册功能
js文件
function fnRegist() { var oUame = document.getElementById("uname") var oError = document.getElementById("error_box") var oPass = document.getElementById("upassworld").value; var oPass1 = document.getElementById("upassworld1").value; var isoError = true; oError.innerHTML = "<br>" //uname if (oUame.value.length<6 || oUame.value.length>20) { oError.innerHTML = "用户名为6-10位"; isError = false; return isoError; }else if((oUame.value.charCodeAt(0)>=48) && (oUame.value.charCodeAt(0)<=57) ){ oError.innerHTML="用户名首字母不能是数字"; isError = false; return isoError; }else for(var i=0; i<oUame.value.length;i++){ if((oUame.value.charCodeAt(i)<48||(oUame.value.charCodeAt(i)>57)&&(oUame.value.charCodeAt(i)<97 || (oUame.value.charCodeAt(i)>122)))){ oError.innerHTML="只能是数字或字母"; isError = false; return isoError; } } //upassword if(opass.value.length<6 || opass.value.length>20){ oError.innerHTML = "密码为6-20位"; isError = false; return isoError; } if (oPass!=oPass1){ document.getElementById("error_box").innerHTML = "两次密码不一致" isError = false; return isoError; } return isoError; window.alert("注册成功!") }
.py文件
#注册 @app.route('/regist/' , methods=['GET','POST']) def regist(): if request.method == 'GET': return render_template('regist.html') else: username = request.form.get('username')# 获取form中的数据 password = request.form.get('password') user = User.query.filter(User.username == username).first() if user: return 'username existed' else: user = User(username=username,password=password) db.session.add(user)#数据库操作 db.session.commit() return redirect(url_for('login'))#重新到登录页
html文件
{% extends'base.html' %} {% block title %}注册{% endblock %} {% block head %} <script src="{{ url_for('static',filename='js/regist.js') }}"></script> {% endblock %} {% block main %} <style> .input_box { width: 325px; height: 50px; padding-left: 7px; padding-right: 7px; background: none; line-height: 30px; font-size: 16px; color: bisque; vertical-align: middle; } .box{ align-content: center; background-color: darkgrey; height:450px;width:400px;float:left; text-align: center; vertical-align: middle; position: absolute; top: 50%; left: 50%; margin: -150px 0 0 -150px; border: 1px solid #ccc; border-radius: 20px; } .jj{ width: 78px; margin: 10px 0; padding: 8px 18px; font-size: 20px; border: none; border-radius: 20px; color: #fff!important; background-color: darkslateblue; cursor: pointer; outline: none; } body { background-color: antiquewhite; } .dd{ font-size:28px; color: #fff; } </style> <div class="box"> <h2 class="dd">注册</h2> <form action="{{ url_for('regist') }}" method="post"> <div class="input_box"> 用户名:<input id="uname" type="text" placeholder="请输入用户名" name="username"> </div> <div class="input_box"> 手机号:<input id="uphonenumeber" type="text" placeholder="请输入手机号" name="userphone"> </div> <div class="input_box"> 邮箱:<input id="uemaill" type="text" placeholder="请输入邮箱" name="useremail"> </div> <div class="input_box"> 密码:<input id="upassworld" type="password" placeholder="请输入密码" name="password"> </div> <div class="input_box"> 确认密码:<input id="upassworld1" type="password" placeholder="请再次输入密码"> </div> <div id="error_box"><br></div> <div> <button class="jj" onclick="fnRegist()">确认注册</button> </div> </form> </div> {% endblock %}
8、登录功能
js文件
function fnLogin() { var oUame = document.getElementById("uname"); var opass = document.getElementById("upassworld"); var oError = document.getElementById("error_box"); var isError = true; oError.innerHTML = "<br>"; //uname if (oUame.value.length<6 || oUame.value.length>20) { oError.innerHTML = "用户名为6-10位"; isError = false; return isError; }else if((oUame.value.charCodeAt(0)>=48) && (oUame.value.charCodeAt(0)<=57) ){ oError.innerHTML="用户名首字母不能是数字"; isError = false; return isError; }else { for(var i=0; i<oUame.value.length;i++){ if((oUame.value.charCodeAt(i)<48||(oUame.value.charCodeAt(i)>57)&&(oUame.value.charCodeAt(i)<97 || (oUame.value.charCodeAt(i)>122)))){ oError.innerHTML="只能是数字或字母"; isNotError = false; return isError; } } } //upassword if(opass.value.length<6 || opass.value.length>20){ oError.innerHTML = "密码为6-20位"; isError = false; return isError; } return isError; window.alert("登录成功!") }
.py文件
#登录 @app.route('/login/' , methods=['GET','POST']) def login(): if request.method == 'GET' : return render_template('login.html') else: username = request.form.get('username')# 获取form中的数据 password1 = request.form.get('password') user = User.query.filter(User.username == username).first() if user: if user.check_password(password1): session['user'] = username session['userid'] = user.id session.permanent = True return redirect(url_for('index')) else: return u'password error' else: return u'username is not existed.' return redirect(url_for('index')) # 返回首页
html文件
{% extends'base.html' %} {% block title %}登录{% endblock %} {% block head %} <script src="{{ url_for('static',filename='js/login.js') }}"></script> {% endblock %} {% block main %} <style> .input_box { width: 325px; height: 50px; padding-left: 7px; padding-right: 7px; background: none; line-height: 30px; font-size: 16px; color: bisque; vertical-align: middle; } .box{ align-content: center; background-color: darkgrey; height:260px;width:340px;float:left; text-align: center; vertical-align: middle; position: absolute; top: 50%; left: 50%; margin: -150px 0 0 -150px; border: 1px solid #ccc; border-radius: 20px; } .jj{ width: 78px; margin: 10px 0; padding: 8px 18px; font-size: 20px; border: none; border-radius: 20px; color: #fff!important; background-color: darkslateblue; cursor: pointer; outline: none; } body { background-color: antiquewhite; } .dd{ font-size:28px; color: #fff; } </style> <div class="box"> <h2 class="dd">登录</h2> <form action="{{url_for('login')}}" method="post"> <div class="input_box"> 用户名:<input id="username" type="text" placeholder="请输入用户名" name="username"> </div> <div class="input_box"> 密码:<input id="userpassworld" type="password" placeholder="请输入密码" name="password"> </div> <div id="error_box"><br></div> <div> <button class="jj" onclick="fnLogin()">登录</button> </div> </form> </div> {% endblock %}
9、注销功能
.py文件
# 注销 @app.route('/logout/') def logout(): session.clear() return redirect(url_for('index')) # 清除所有数据返回到首页
10、导航条及夜视功能
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}蜻蜓fans问答平台</title> {# <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/basic.css') }}" base href="" target="_blank">#} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> {% if username %} <a href="{{ url_for('usercenter',user_id = session.get('userid'),tag=1) }}">{{ session.get('user') }}</a> {% else %} <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <nav class="navbar navbar-default" role="navigation"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button> <a class="navbar-brand" href="#">蜻蜓fans</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li> <a href="{{ url_for('index') }}">首页</a> </li> <li> <a href="{{ url_for('question') }}">发布问答</a> </li> <li> <a href="{{ url_for('login') }}">登录</a> </li> <li> <a href="{{ url_for('regist') }}">注册</a> </li> <li> <a href="{{ url_for('logout') }}">注销</a> </li> </ul> <form action="{{ url_for('search') }}" method="get" class="navbar-form navbar-left" role="search"> <div class="form-group"> <input name="q" type="text" class="form-control" placeholder="请输入关键字"/> </div><button type="submit" class="btn btn-default">搜索</button> {% endif %} </form> <script> function mySwitch() { var oBody = document.getElementById("myBody"); var oOnOff = document.getElementById("myOnOff"); if(oOnOff.src.match("bulbon")){ oOnOff.src="http://www.runoob.com/images/pic_bulboff.gif"; oBody.style.background="black"; oBody.style.color="darksalmon"; }else { oOnOff.src="http://www.runoob.com/images/pic_bulboff.gif"; oBody.style.background="darksalmon"; oBody.style.color="black"; } } </script> <img id="myOnOff" onclick="mySwitch()" src="http://www.runoob.com/images/pic_bulbon.gif" width="30px";> </div> </nav> </div> </div> </div> {% block main %} {% endblock %} </head> <body id="myBody"> </body> </html>
11、发布问答功能
.py文件
@app.route('/question/',methods=['GET', 'POST']) # 跳转注册,methods定义它有两种请求方式 @loginFirst def question(): if request.method == 'GET': return render_template('question.html') else: title = request.form.get('title') detail = request.form.get('detail') author_id = User.query.filter(User.username == session.get('user')).first().id question = Question(title = title,detail =detail,author_id = author_id) db.session.add(question) db.session.commit() return redirect(url_for('index'))
html文件
{% extends 'base.html' %} } {% block title %}发布问答-{% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/question.css') }}"> <script src="{{ url_for('static',filename='js/login.js') }}"></script> {% endblock %} {% block main %} <style> body{ background-color: antiquewhite; } .form-group{ margin: 20px auto 125px auto; width: 880px; overflow: hidden; font-family: 'Georgia',Georgia,'Times New Roman',Times,'Microsoft YaHei',SimSun,SimHei,serif; } .gg{ color: #5b5b5b; font-size: 15px; overflow: hidden; text-align: right; height: 25px; line-height: 15px; } .button{ float: right; width: 100px; margin: 10px 0; padding: 8px 18px; font-size: 16px; border: none; border-radius: 20px; color: #fff!important; background-color: blueviolet; cursor: pointer; outline: none; display: block; } </style> <form action="{{ url_for('question') }} " method="post"> <div class="form-group"> <form action="{{ url_for('question') }}" method="post"> <label style="color: #5b5b5b;font-size: 20px;" for="questionTitle">发布问答</label><br> <label class="gg" for="questionTitle" id="title" name="title">标题</label><br> <textarea class="form-control" rows="4" cols="120" id="questionTitle" name="title"></textarea><br> <label class="gg" for="questionTitle" id="detail" name="detail">详情</label><br> <textarea class="form-control" rows="14" cols="120" id="questionTitle" name="detail"></textarea><br> <input type="checkbox" name="c1" id="c1" value="">记住我<br> <button type="submit" onclick="fnLogin()" class="button">发布问答</button> </form> </div> </form> {% endblock %}
12、问答详情及发布评论功能
.py文件
@app.route('/detail/<question_id>') def detail(question_id): quest = Question.query.filter(Question.id == question_id).first() return render_template('detail.html',ques = quest) @app.route('/comment/',methods=['POST']) @loginFirst def comment(): comment = request.form.get('new_comment') ques_id = request.form.get('question_id') auth_id = User.query.filter(User.username == session.get('user')).first().id comm = Comment(author_id=auth_id, question_id=ques_id, detail=comment) db.session.add(comm) db.session.commit() return redirect(url_for('detail' , question_id = ques_id))
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> {% extends 'base.html' %} {% block title %}问答详情-{% endblock %} {% block main %} <style> body{ background-color: antiquewhite; } </style> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> </div> </div> <div class="row clearfix"> <div class="col-md-4 column"> </div> <div class="col-md-4 column"> <div class="list-group"> <h3><a href="{{ url_for('usercenter',user_id = ques.author.id,tag=1) }}">{{ ques.author.username }}</a></h3></a> <div class="list-group-item"> 标题:{{ ques.title }} </div> <div class="list-group-item"> <p class="list-group-item-text"> 详情:{{ ques.detail }} </p> </div> <div class="list-group-item"> <span class="badge"></span> </div> <a class="list-group-item active"><span class="badge"></span>{{ ques.create_time }}<br /></a> </div> </div> <div class="col-md-4 column"> </div> </div> </div> {#{{ ques.author.username }}#} <form action="{{ url_for('comment') }}" method="post" style="margin: 20px"> <div class="form-group"> <textarea name="new_comment" id="new-comment" cols="60" rows="5" placeholder="输入你的评论..."></textarea> <input type="hidden" name="question_id" value="{{ ques.id }}"> </div> <button type="submit" class="btn btn-default" >发送</button> </form> <h4>评论:({{ ques.comments|length }})</h4> <ul class="list-group" style="margin: 30px"> <a>{% for foo in ques.comments %}</a> <li class="list-group-item" > <span class="glyphicon glyphicon-heart-empty" aria-hidden="true" ></span> <a href="{{ url_for('usercenter',user_id=foo.author.id,tag=1) }}">{{ foo.author.username }}</a> <span class="badge">{{ foo.creat_time }}</span> <p style="">{{ foo.detail }}</p><br> </li> {% endfor %} </ul> {% endblock %}
13、个人中心功能
.py文件
@app.route('/user/<user_id>/<tag>') @loginFirst def usercenter(user_id, tag): user = User.query.filter(User.id == user_id).first() context = { 'user':user # 'username':user.username, # 'questions':user.questions, # 'comments':user.comments } if tag == '1': return render_template('usercenter1.html', **context) elif tag == '2': return render_template('usercenter2.html', **context) else : return render_template('usercenter3.html', **context)
html文件:
(1)user模板
{% extends "base.html" %} {% block title %}个人中心-{% endblock %} {% block head %} <style> .nav_ul li{ float: left; list-style: none; margin: 10px; border-bottom: antiquewhite; } </style> <style> body{ background-color: antiquewhite; } </style> <script src="{{ url_for('static',filename='js/regist.js') }}"></script> {% endblock %} {% block main %} <body> <h3><span class="alyphicon alyphicon-user" aria-hidden="true"></span>{{ user.username }}</h3> <ul class="nav nav-tabs"> <li role="presentation"><a href="{{ url_for('usercenter',user_id = user.id,tag = '1') }}">全部问答</a></li> <li role="presentation"><a href="{{ url_for('usercenter',user_id = user.id,tag = '2') }}">全部评论</a></li> <li role="presentation"><a href="{{ url_for('usercenter',user_id = user.id,tag = '3') }}">个人信息</a></li> </ul> </body> {% block user %}{% endblock %} {% endblock %}
(2)usercenter1
{% extends 'user.html' %} {% block user %} <div class="page-header"> <h3><span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>{{ user.username }} <br> <small>全部问答<span class="badge"></span></small> </h3> <ul class="list-group" style="margin: 10px"> {% for foo in user.question %} <li class="list-group-item"> <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span> <a href="#">{{ foo.author.username }}</a> <span class="badge">{{ foo.create_time }}</span> <p>{{ foo.detail }}</p> </li> {% endfor %} </ul> </div> {% endblock %}
(3)usercenter2
{% extends 'user.html' %} {% block user %} <div class="page-header"> <h3><span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>{{ user.username }} <br> <small>全部评论<span class="badge"></span></small> </h3> <ul class="list-group" style="margin: 10px"> {% for foo in user.comments %} <li class="list-group-item"> <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span> <a href="#">{{ foo.author.username }}</a> <span class="badge">{{ foo.create_time }}</span> <p>{{ foo.detail }}</p> </li> {% endfor %} </ul> </div> {% endblock %}
(4)usercenter3
{% extends 'user.html' %} {% block user %} <div class="page-header"> <h3><span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>{{ user.username }} <br> <small>个人信息<span class="badge"></span></small> </h3> <ul class="list-group" style="margin: 10px"> <li class="list-group-item">用户:{{ user.username }}</li> <li class="list-group-item">编号:{{ user.id }}</li> <li class="list-group-item">昵称:</li> <li class="list-group-item">文章:</li> </ul> </div> {% endblock %}
14、搜索功能
.py文件
@app.route('/search/') def search(): qu = request.args.get('q') ques = Question.query.filter( or_ (Question.title.contains(qu), Question.detail.contains(qu), # Question.author_id.contains(qu) ) ).order_by('-create_time') return render_template('index.html',questions = ques)
15、装饰器
#decorator装饰器,它能增强函数的功能,它是一个函数,它的参数是一个函数,返回值是一个函数 def loginFirst(func): # 定义一个函数将其返回 @wraps(func) def wrapper(*args,**kwargs): if session.get('user'): return func(*args, **kwargs) else: return redirect(url_for('login')) # 返回一个函数 return wrapper
16、上下文处理器
# 上下文处理器 @app.context_processor def mycontext(): usern = session.get('username') if usern: return {'username':usern} else: return {}