期末作品检查
一、个人学期总结
在本学期中在missdu的带领下,我们学习了管理信息系统python这一课程,在这个课程中我发现,跟随老师的步伐,在学习Python+Flask+MysqL的web建设时,我们安装了mySQL,pycharm和一些python的第三方库,一开始接触python我们学的是简单的输出输入交互和一些数字的计算,python语言优点在于它的简洁灵活,接着我们了解turtle库(海龟库),在此环境中练习条件、循环、函数定义的代码敲打,并画出了五角星、同心圆、太阳花、中国国旗等。随后便学习了字符串的基本操作,学会输入字符串,输出代码计算后的结果。还学习了凯撒密码、GDP格式化输出、九九乘法表等简单操作。利用python进行英文词汇统计,组合数据类型练习,用文件形式实现完成的英文词频统计、中文词频统计。利用datetime处理日期和时间,将字符串转化成imestamp与timedelta,同时了解管理信息系统概念与基础,理解数据存储的方式如字典、列表、元祖、集合,了解到Web是图形化的和易于导航的、与平台无关、是分布式的、是动态的、是交互的。虽然语句都挺简单,但这激发了我们对学习python的兴趣,并提升了我们对编程语言的思维能力,有助于下半学期我们构建Flask框架制作网页的学习。
学习初期第一方面,我认为学习每一知识点的开始则是了解其知识点的概念及基础。首先则是认识URL,观察那些常用网站的网址,区分它们不同组成部分。然后,观察web的浏览过程。最后,最为重要的则是实操,了解HTML基础并联系使用标签制作最简单的页面。自行了解各个标签的用法以及整体标签的规范。第二方面,认识div块与form表单的作用,利用div块与form表单制作登录页面。同时,练习使用各种列表,例如下拉列表选择框、无序列表、有序列表以及定义列表。 观察常用网页的HTML元素,并在实操过程中,用已学的标签模仿制作。通过网络搜索补充自己所想要的知识点,不要仅仅依赖于课堂。
开始Flask项目,加载静态文件,父模板的继承和扩展,连接mysql数据库,创建用户模型,建立mysql和app的连接。通过用户模型,对数据库进行增删改查操作。完成注册功能,将界面的数据存到数据库,redirect重定向登录页。完成登录功能,用session记住用户名,像操作字典一样操作‘session’:增加用户名‘session[‘username’]’=username。登录之后更新导航,用上下文处理器app_context_processor定义函数,获取session中保存的值,返回字典,在父模板中更新导航,插入登录状态判断代码。完成注销功能,清除session。发布功能的实现,制作首页的显示列表,首页列表显示全部问答,完成问答详情页布局,从首页问答标题到问答详情页,完成评论功能,完成评论列表显示及排序,个人中心显示,个人中心标签页导航,完成个人中心—导航标签,实现搜索功能(包括高级搜索等),最重要的是实现密码加密功能,还有模型分离与数据迁移,使代码更简洁更有保存用户的确定状态。
python,是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。Flask是一个面向简单需求小型应用的“微框架(microframework)”,Flask选择组件的额外工作给那些使用案例不适用标准ORM的开发者提供了更多的灵活性,同样也给使用不同工作流和模版化系统的开发者们带来了灵活性。MySQL是一个关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
学习了python+flask web开发,感觉计算机语言还是有一点乐趣的,不至于非常枯燥无味的我觉的自己真正的学到了东西,从新手到会独立完成自己的项目,过程中遇到很多问题,查阅资料,问同学之后都解决了, 虽然这个学期python课程学习结束了,但是对于我来说学习的程度不会止于此,我还要继续学习python语言,因为这门语言对我来说吸引力很大,可以作为以后专门发展的方向,我觉得自己在语言方面还不够规范跟熟练,还要继续加强学习。
二、Python+Flask+MysqL的web建设技术过程总结
1、使用工具
主要工具有:pycharm 、 MySQL


创建数据库mis_db
db.create_all() # 测试是否连接成功

2、完成基本的页面设计
(1)、导航条和注册界面
# 注册。
@app.route('/zhuce/', methods=['GET', 'POST']) # methods定义它有两种请求方式,因为它在表单的请求是post,类似我们在idea中的sava请求模式
def zhuce():
if request.method == 'GET':
return render_template('zhuce.html')
else:
username = request.form.get('user') # post请求模式,安排对象接收数据
password = request.form.get('pass')
nickname = request.form.get('nickname')
user = User.query.filter(User.username == username).first() # 作查询,并判断
if user:
return u'该用户已存在'
else:
user = User(username=username, password=password, nickname=nickname) # 将对象接收的数据赋到User类中,即存到数据库
db.session.add(user) # 执行操作
db.session.commit()
return redirect(url_for('denglu')) # redirect重定向

用户名和密码只能 6—20位功能


密码不一致功能

(2)、登录界面
# 登录。
@app.route('/denglu/', methods=['GET', 'POST']) # methods定义它有两种请求方式
def denglu():
if request.method == 'GET':
return render_template('denglu.html')
else:
username = request.form.get('user') # post请求模式,安排对象接收数据
password1 = request.form.get('pass')
user = User.query.filter(User.username == username).first() # 作查询,并判断
if user: # 判断用户名
if user.check_password(password1): # 判断密码
session['user'] = username # 利用session添加传回来的值username
session.permanent = True # 设置session过期的时间
return redirect(url_for('daohang'))
else:
return u'用户密码错误'
else:
return u'用户不存在,请先注册'
用户名和密码只能6—20位功能


(3)、发布问答界面
# 发布。
@app.route('/fabu/', methods=['GET', 'POST']) # methods定义它有两种请求方式
@loginFirst # 将decorator定义的增强函数放在待增强函数定义的上面
def fabu():
if request.method == 'GET':
return render_template('fabu.html')
else:
title = request.form.get('title') # post请求模式,安排对象接收数据
detail = request.form.get('detail')
author_id = User.query.filter(
User.username == session.get('user')).first().id # 将session get到的user进行查询并取出id放到外键author_id中
fabu = Fabu(title=title, detail=detail, author_id=author_id) # 将对象接收的数据赋到Fabu类中,即存到数据库
db.session.add(fabu) # 执行操作
db.session.commit() # 提交到数据库
return redirect(url_for('daohang')) # redirect重定向

(4)、评论页面
# 评论
@app.route('/comment/', methods=['POST'])
@loginFirst
def comment():
detail = request.form.get('pinglun')
author_id = User.query.filter(User.username == session.get('user')).first().id
fabu_id = request.form.get('hidden_id')
comment = Comment(detail=detail, author_id=author_id, fabu_id=fabu_id)
db.session.add(comment) # 执行操作
db.session.commit() # 提交到数据库
return redirect(url_for('detail', question_id=fabu_id))
(5)、个人中心界面
# 个人中心 @app.route('/usercenter/<user_id>/<tag>') @loginFirst def usercenter(user_id, tag): user = User.query.filter(User.id == user_id).first() context = { 'user_id': user.id, 'username': user.username, 'fabus': user.fabu, '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)

(6)、搜索界面
# 搜索
@app.route('/search/')
def search():
qu = request.args.get('q')
ques = Fabu.query.filter(
or_(
Fabu.title.contains(qu),
Fabu.detail.contains(qu)
)
).order_by('-creat_time')
return render_template('daohang.html', fabus=ques)

(7)、图片区界面
# 图片。
@app.route('/tupian/')
def tupian():
return render_template('tupian.html')
(8)、修改密码界面
# 修改密码 @app.route('/xiugai/<user_username>',methods=['GET','POST']) def xiugai(user_username): user=User.query.filter(User.username==user_username).first() if request.method == 'GET': return render_template('xiugai.html',user=user) else: password=user.password=request.form.get('password') db.update(password) db.session.commit() return redirect(url_for('denglu'))
(9)、设置界面
<ul class="dropdown-menu"> <li><a href="{{ url_for('fabu') }}">继续发布</a></li> <li><a href="{{ url_for('tupian') }}">上传图片</a></li> </ul>
点击“继续发布”会跳转发布界面,点击“上传图片”会跳转图片区界面
3、通过用户模型,对数据库进行增删改查
'''
# 插入功能
user = User(username='15',password='12')
db.session.add(user)
db.session.commit()
# 查询功能
user=User.query.filter(User.username=="15").first()
print(user.username,user.password)
# 修改功能
user=User.query.filter(User.username=="15").first()
user.password='888'
db.session.commit()
# 删除功能
user=User.query.filter(User.username=="15").first()
db.session.delete(user)
db.session.commit()
'''
4、密码保护
from werkzeug.security import generate_password_hash,check_password_hash
_password = db.Column(db.String(200), nullable=False) # 内部使用
# 定义属性 password:
@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_password):
result = check_password_hash(self._password, row_password)
return result

5、数据库配置信息config.py
import os
DEBUG = True
SECRET_KEY = os.urandom(24)
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'ROOT'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'mis_db'
# 配置和数据库的连接信息
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost/mis_db?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False
浙公网安备 33010602011771号