期末作品检查
Posted 蒋宇翔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期末作品检查相关的知识,希望对你有一定的参考价值。
一、个人学期总结
这学期我们学习了杜云梅老师的python这门课并实现基于Python的Flask框架web建设项目,使我受益匪浅,学习到了许多知识。老师上课概念清晰,而且十分注重联系实际包含了大量的实际案例和案例研究,通过这些案例的学习使我们绕过了不少弯路,这些有利于培养我们的分析能力和解决问题的能力。作为一门非常有潜力的语言,python正在编程上发挥着越来越大的作用。这学期,通过对python基础知识的学习,对python有了一定的认识。我们从最基础的用简单的代码控制点的走动,到后面的实现五角星的图案,再到构建出一个网页的前端,再到学习Flask知识,最后的整合学习的所有的知识构建出一个较为完善的管理信息系统。管理信息系统这门课就快要上完了,但我们队管理信息系统的知识却没有学完,我们要把这些知识运用到今后的学习和工作中去,多我们今后的帮助是非常巨大的。
所以我觉得养成一个持久学习Python的学习习惯极其重要,学习习惯是在学习过程中经过反复练习形成并发展,成为一种个体需要的自动化学习行为方式。良好的学习习惯,有利于激发我们学习的积极性和主动性;有利于形成学习策略,提高学习效率;有利于培养自主学习能力;有利于培养我们的创新精神和创造能力,使我们终身受益。所以在以后的学习中不可以把学到的Python知识还给老师,而是要自己去巩固与深化学习Python。
二、Python+Flask+mysql的web建设技术过程总结
Python是一种面向对象、直译式计算机程序设计语言。公认的特点是简单、易学、免费、开源等等。对我这种初学者来说,我最为欣赏Python的地方是对字符串操作特别的灵活、采取缩进的方式简单明了、以及简单的语法。
经过一个学期的学习,实现了Python+Flask+MysqL的web建设,创建了一个宠物交流网站,页面具有宠物交流的信息,能够通过用户登录后进行对于宠物的讨论,还能够发表评论、搜索文章关键字。
1.使用工具
主要工具是Pycharm和Navicat for MySQL
2、部分重要代码
增删查改
# db.create_all() \'\'\'添加\'\'\' # user=User(username=\'mis111\',password=\'mis111\') # db.session.add(user) # db.session.commit() \'\'\'修改\'\'\' # user = User.query.filter(User.username == \'mis111\').first() # user.password = \'00000\' # db.session.commit() \'\'\'删除\'\'\' # user = User.query.filter(User.username == \'mis111\').first() # db.session.delete(user) # db.session.commit()
创建User,sent,comment类
class User(db.Model):#创建类User __tablename__ = \'user\' #类对应的表名user id = db.Column(db.Integer, primary_key=True, autoincrement=True)#自动生成id username = db.Column(db.String(20), nullable=False)#不能为空 _password = db.Column(db.String(200), nullable=False) # 加密 不能为空 nickname = db.Column(db.String(50)) userphone = db.Column(db.String(20), 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_password): #确定密码 result = check_password_hash(self._password, row_password) return result class Sent(db.Model): __tablename__ = \'sent\' 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)#判断不能为空 author_id = db.Column(db.Integer, db.ForeignKey(\'user.id\'))#使user id对应author id creat_time = db.Column(db.DateTime, default=datetime.now)#获得本地时间 使其生成create time author = db.relationship(\'User\', backref=db.backref(\'sent\')) 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\')) sent_id = db.Column(db.Integer, db.ForeignKey(\'sent.id\')) creat_time = db.Column(db.DateTime, default=datetime.now) detail = db.Column(db.TEXT, nullable=False) sent = db.relationship(\'Sent\', backref=db.backref(\'comment\', order_by=creat_time.desc)) author = db.relationship(\'User\', backref=db.backref(\'comment\'))
导入第三方库
from flask import Flask, render_template, request, redirect, url_for, session from flask_sqlalchemy import SQLAlchemy import config,os from datetime import datetime from functools import wraps from sqlalchemy import or_,and_ from werkzeug.security import generate_password_hash,check_password_hash
连接数据库
import os DEBUG=True SECRET_KEY=os.urandom(24) #加密key DIALECT=\'myaql\' DRIVER=\'mysqldb\' USERNAME=\'root\' PASSWORD=\'ROOT\' HOST=\'localhost\' DATABASE=\'mis_db2\' SQLALCHEMY_DATABASE_URI = \'mysql+pymysql://root:123456@localhost:3306/mis_db2?charset=utf8\' # SQLALCHEMY_DATABASE_URI = \'mysql+pymysql://root:123456@localhost:3306/mis_db?charset=utf8\' SQLALCHEMY_TRACK_MODIFICATIONS = False
登录注册发布等功能实现
@app.route(\'/\') def base(): context = { \'username\': Sent.query.order_by(\'creat_time\').all(), # order_by(\'-creat_time\')按时间降序排列,Fabu.query.all()查出了Fabu类的所有元组 } return render_template(\'shouye.html\', **context)# **context将该封装传递到daohang.html中调用,而上下文处理器是可以在任何html中调用。 # @loginFirst @app.route(\'/detail/<sent_id>\')#主PY文件写视图函数,带id参数。 def detail(sent_id): sentt = Sent.query.filter(Sent.id == sent_id).first() context = { \'comment\': Comment.query.all(), } return render_template(\'detail.html\', sen=sentt, **context) @app.route(\'/login/\', methods=[\'GET\', \'POST\'])# 跳转登陆,methods定义它有两种请求方式 def login(): if request.method == \'GET\': return render_template(\'dl.html\') else: username = request.form.get(\'dlusername\')# post请求模式,安排对象接收数据 password = request.form.get(\'dlpassword\') user = User.query.filter(User.username == username).first()# 判断用户名是否存在 if user: if user.check_password(password): session[\'user\'] = username#利用session添加传回来的值username session.permanent = True# 设置session过期的时间 return redirect(url_for(\'base\')) else: return \'密码错误\' else: return \'用户不存在\' #用上下文处理器app_context_processor定义函数 @app.context_processor def mycontext(): usern = session.get(\'user\')#获取session中保存的值 if usern: return {\'usern\': usern} # 包装到username,在所有html模板中可调用 else: return {}# 返回空字典,因为返回结果必须是dict @app.route(\'/logout/\') def logout(): session.clear()#清除session return redirect(url_for(\'base\')) @app.route(\'/register/\', methods=[\'GET\', \'POST\'])# 跳转注册,methods定义它有两种请求方式因为它在表单的请求是post,类似我们在idea中的sava请求模式 def register(): if request.method == \'GET\': return render_template(\'zhuce.html\') else: username = request.form.get(\'username\') # post请求模式,安排对象接收数据 password = request.form.get(\'password\') nickname = request.form.get(\'nickname\') userphone = request.form.get(\'userphone\') user = User.query.filter(User.username == username).first() if user: return "账户已存在" else: user = User(username=username, password=password, nickname=nickname, userphone=userphone) # 将对象接收的数据赋到User类中,即存到数据库 db.session.add(user) db.session.commit() return redirect(url_for(\'login\'))# redirect重定向 #编写要求登录的装饰器 def loginFirst(func):#参数是函数 @wraps(func)#加上wraps,它可以保留原有函数的__name__,docstring def wrapper(*args, **kwargs):#定义wrapper函数将其返回,用*args, **kwargs把原函数的参数进行传递 if session.get(\'user\'): return func(*args, **kwargs) else: return redirect(url_for(\'login\'))#要求登录 return wrapper @app.route(\'/sent/\', methods=[\'GET\', \'POST\'])#应用装饰器,要求在发布前进行登录,登录后可发布。 @loginFirst #将decorator定义的增强函数放在待增强函数定义的上面 def sent(): if request.method == \'GET\': return render_template(\'sent.html\') else: title = request.form.get(\'titleDetail\') detail = request.form.get(\'questionDetail\') author_id = User.query.filter(User.username == session.get(\'user\')).first().id #将session get到的user进行查询并取出id放到外键author_id中 sent = Sent(title=title, detail=detail, author_id=author_id) db.session.add(sent) db.session.commit() return redirect(url_for(\'base\')) # return render_template(\'sent.html\') @app.route(\'/comment/\', methods=[\'POST\'])#应用装饰器,要求在评论前进行登录,登录后可评论。 @loginFirst def comment(): comment = request.form.get(\'comment\') sent_id = request.form.get(\'sent_id\') auth_id = User.query.filter(User.username == session.get("user")).first().id# # 根据id查询出整条元组记录 comm = Comment(author_id=auth_id, sent_id=sent_id, detail=comment) db.session.add(comm) db.session.commit() return redirect(url_for(\'detail\', sent_id=sent_id)) @app.route(\'/usercenter/<user_id>/<tag>\')#应用装饰器,要求在个人中心前进行登录,登录后可查看个人中心。 @loginFirst def usercenter(user_id, tag): user = User.query.filter(User.id == user_id).first() context = { \'username\': user.username, \'sent\': user.sent, \'comment\': user.comment, \'user\': user } if tag == \'wenda\': #如果tag是问答页面 return render_template(\'wenda.html\', **context)#返回至问答 elif tag == \'pinlun\': #如果tag是评论页面 return render_template(\'pinlun.html\', **context)#返回至评论 else: return render_template(\'GRZX.html\', **context)#返回至个人中心 @app.route(\'/search/\') def search(): qu = request.args.get(\'q\')#获取搜索关键字 ques = Sent.query.filter(#条件查询 or_( Sent.title.contains(qu), Sent.detail.contains(qu) ) ).order_by(\'creat_time\') return render_template(\'shouye.html\', username=ques)#加载查询结果
3、完成基本的网页设计
注册页面
登录页面
发布页面
首页页面
个人中心页面
以上是关于期末作品检查的主要内容,如果未能解决你的问题,请参考以下文章