个人学期总结
经过一个学期的学习,管理信息系统这门课程真的非常有趣,而且很不可思议。刚开始,一些简单的小练习,让我觉得python类似C语言,但是越学越发现它的不一般,很多的功能只需简单import就能实现。turtle基础练习,原来还能画圆,五角星等等各式各样的图案,涂上你想要的色彩,一幅画即成。在字符串,格式化输出等等的基础练习中,特别在打印99乘法表时,我觉得在表述方面远比C语言简单得多了,代码清晰,还能进行词频统计从而得到了人们想要的数据,这对数据的分析有很大的帮助。通过datatime函数,能准确知道今天的日期,在这年的第几天第几周,距离下一年还有多久,只需要几行代码,就能知道,再也不用花费时间去数数了。进入到网页的建设中,我们经常使用的网页原来是这样形成的,集合了登陆,注册,注销,发布问答,评论功能的html,一串串代码变成了我们可以直观看到的页面,不得不说,计算机语言的强大。头部的导航使用户操作更加方便,CSS样式使得页面更加的美观,JavaScript的登陆注册验证,对输入的文字有了具体的要求,夜间模式的开启与关闭,页面也有了人性化。通过连接mysql数据库,数据存储也不再是难题。当完完整整的做完这个页面后,惊讶于原来我也能成,感叹于信息时代的科技力量。
总结Python+Flask+MysqL的web建设技术过程,标准如下:
即是对自己所学知识的梳理
也可作为初学入门者的简单教程
也可作为自己以后复习的向导
也是一种向外展示能力的途径
一.确定一个目标
搭建一个博客
二.前期准备
1.python语法知识
2.前端基础知识:html,css,javascript,bootstrap
3.web框架:flask学习指南
4.需要下载安装的软件:python,pycharm
5.下载安装MySQL的数据库 https://dev.mysql.com/downloads/mysql/
6.下载安装MySQL-Python的中间件 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
7.观察网页
三
1.做出一个简单整体首页(base)
2.登陆页面和登陆验证(javasript)
<div class="box"> <h2 class="ziti">登录</h2> <div class="input_box"> <input id="uname" type="text" placeholder="请输入用户名"> </div> <div class="input_box"> <input id="upass" type="password" placeholder="请输入密码"> </div> <div id="error_box"><br></div> <div class="input_box"> <button onclick="fnLogin()">登录</button> </div> </div>
<script> function fnLogin() { var oUname = document.getElementById("uname") var oError = document.getElementById("error_box") var oUpass = document.getElementById("upass") if(oUname.value.length<6 ){ oError.innerHTML="用户名至少6位" } if(oUname.value.length >12){ oError.innerHTML="用户名最多12位" } if(oUpass.value.length<6){ oError.innerHTML="密码至少6位" } if(oUpass.value.length>12){ oError.innerHTML="密码最多12位" } } </script>
3.注册页面和注册验证(类似登陆功能)
4.用url_for加载静态文件,用{% %}子模板继承父模板,使各个页面能与首页连接
用url_for加载静态文件:href="{{ url_for(‘static‘,filename=‘css/index.css‘) }}"
子模板继承父模板
{% extends ‘base.html’ %}
父模板提前定义好子模板可以实现一些自己需求的位置及名称。
<title>{% block title %}{% endblock %} </title>
{% block head %}{% endblock %}
{% block main %}{% endblock %}
5.连接mysql数据库,创建模型
python文件:如图为用户模型的创建
from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) # 创建用户模型: class User(db.Model): __tablename__ = ‘user‘ id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(20),nullable=False) password = db.Column(db.String(20),nullable=False) db.create_all() 配置文件: from flask_sqlalchemy import SQLAlchemy SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://root:@localhost:3306/mis15?charset=utf8‘ SQLALCHEMY_TRACK_MODIFICATIONS = False
6.登陆功能完成,用session记住用户名
py: @app.route设置methods;GET;POST
session:从`flask`中导入`session`;设置`SECRET_KEY`;操作字典一样操作`session`:增加用户名`session[‘username‘]=`username
7.更新登陆注册的导航
用上下文处理器app_context_processor定义函数
- 获取session中保存的值
- 返回字典
8.发布功能完成
编写要求登录的装饰器
from functools import wraps
def loginFirst(func): #参数是函数
@wraps(func)
def wrapper(*args, ** kwargs): #定义个函数将其返回
#要求登录
return func(*args, ** kwargs)
return wrapper #返回一个函数
9.制作首页的显示列表
<ul >
<li>Coffee</li>
<li>Tea</li>
<li>Milk</li>
</ul>
10.首页列表显示全部问答
- 将数据库查询结果传递到前端页面 Question.query.all()
- 前端页面循环显示整个列表。
- 问答排序
def index(): context={ ‘questions‘:Question.query.order_by(‘-creat_time‘).all() }
<ul class="list-group"> {% for foo in questions %} <li style="padding-left: 0px;padding-right: 10px;box-shadow: #cccccc" class="list-group-item"> <span class="glyphicon glyphicon-leaf" aria-hidden="true"></span> <a href="#">{{foo.author.username}}</a> <br> <a href="{{ url_for(‘detail‘,question_id=foo.id) }}" class="title">{{foo.title}}</a> <br> <span class="badge">{{foo.creat_time}}</span> <p class="detail">{{foo.detail}}</p> </li> {% endfor %} </ul>
11.完成问答详情页布局
- 包含问答的全部信息
- 评论区
- 以往评论列表显示区。
12.从首页问答标题跳转到问答详情页
首页标题的标签做带参数的链接;
主PY文件写视图函数,带id参数。
@app.route(‘/detail/<question_id>‘)
def detail(question_id):
quest =
return render_template(‘detail.html‘, ques = quest)
{{ url_for(‘detail‘,question_id = foo.id) }}
在详情页将数据的显示在恰当的位置;
{{ ques.title}}
{{ ques.id }}{{ ques.creat_time }}
{{ ques.author.username }}
{{ ques.detail }}
建立评论的对象关系映射;类似于用户User和Question
class Comment(db.Model):
__tablename__=‘comment‘
13.完成评论功能
定义评论的视图函数
@app.route(‘/comment/‘,methods=[‘POST‘]) def comment():
读取前端页面数据,保存到数据库中
用<input type="hidden" 方法获取前端的"question_id"
<input type="hidden" name="question_id" value="{{ques.id}}" />
显示评论次数
<h4>评论:({{ ques.comments|length }}) </h4>
要求评论前登录 参考发布问答前登陆
@loginFrist
14.评论列表显示及排序
显示所有评论
{% for foo in ques.comments %}
所有评论排序
question = db.relationship(‘Question‘, backref=db.backref(‘comments‘, order_by=creat_time.desc))
显示评论条数
{{ ques.comments|length }}
15.显示个人中心
1.个人中心的页面布局(html文件及相应的样式文件)
2.定义视图函数def usercenter(user_id):
3.向前端页面传递参数
4.页面显示相应数据
发布的全部问答
发布的全部评论
个人信息
5.评论列表显示及排序,个人中心显示
16.更新个人中心标签页导航
新页面user.html,用<ul ><li role="presentation"> 实现标签页导航。子模板继承父模板。
<ul class="nav nav-tabs"> <li role="presentation"><a href="#">Home</a></li> <li role="presentation"><a href="#">Profile</a></li> <li role="presentation"><a href="#">Messages</a></li> </ul>
user.html继承base.html。
重写title,head,main块.
将上述<ul>放在main块中.
定义新的块user,让上次作业完成的个人中心页面,继承user.html,原个人中心就自动有了标签页导航。
17.完成个人中心
个人中心—视图函数带标签页面参数tag;个人中心—导航标签链接增加tag参数;个人中心—有链接到个人中心页面的url增加tag参数
@app.route(‘/usercenter/<user_id>/<tag>‘) def usercenter(user_id, tag): if tag == ‘1‘: return render_template(‘usercenter1.html‘, **context)
<li role=“presentation”><a href=“{{ url_for(‘usercenter’,user_id = user.id,tag = ‘1’) }}">全部问答</a></li>
<a href="{{ url_for(‘usercenter‘,user_id = session.get(‘userid‘), tag=1) }}">{{ session.get(‘user‘) }}</a>
18.实现搜索功能
- 准备视图函数search()
- 修改base.html 中搜索输入框所在的
<form action="{{ url_for(‘search‘) }}" method="get"> <input name="q" type="text" placeholder="请输入关键字">
- 完成视图函数search()
- 获取搜索关键字
q = request.args.get(‘q’) - 条件查询
qu = Question.query.filter(Question.title.contains(q)).order_by(‘-creat_time’) - 加载查询结果:
return render_template(‘index.html‘, question=qu) - 组合条件查询
from sqlalchemy import or_, and_
- 获取搜索关键字
19.密码保护 信息的不安全
1.更新User对象,设置对内的_password
class User(db.Model): __tablename__ = ‘user‘ _password = db.Column(db.String(200), nullable=False) #内部使用
2.编写对外的password
from werkzeug.security import generate_password_hash, check_password_hash @property def password(self): #外部使用,取值 return self._password @password.setter def password(self, row_password):#外部使用,赋值 self._password = generate_password_hash(row_password)
3.密码验证方法:
def check_password(self, row_password): #密码验证 result = check_password_hash(self._password,row_password) return result
4.登录验证:
password1 = request.form.get(‘password‘) user = User.query.filter(User.username == username).first() if user: if user.check_password(password1):
最后完善整个页面,并使之更加美观
学习期间难免会遇到各种各样的问题,先试着在网上查询资料,学会独立排查问题,主要是多多练习,多多尝试。