学期总结
本学期学习了管理信息系统这门课程,临近期末,觉得颇有收获。管理信息系统主要由前端和后端组成,前端由html语言编写,主要用于设计网站页面,该语言功能强大,语法规范,我在学习的时候感觉容易上手。后端由python语言编写,该语言功能强大,语法简洁,有时候短短几行代码便可以完成一个功能的实现。通过一学期的学习,对于这两种编程语言有了最基本的认识,对于平时使用的教务系统、火车票购票系统有了比其他没学过这个课程的学生更进一步的深刻理解,对于这些系统的运行原理也了解地更透彻。管理信息系统主要是由用户、管理员、软件和数据所组成的人为的系统,管理信息系统主要用于将有用的信息及时和准确地收集、加工和存储,用于现实生活中管理活动的应用,可以说,信息系统的产生极大地方便了我们的生活。本学期的学习也为我以后完成毕业设计打下了一定程度的基础,但由于时间有限,目前我的管理信息系统开发水平属于入门级别,万丈高楼,起于累土,后面还需要多加学习与专研,通过这一学期对python语言的学习,我明白了学习计算机语言需要不断地去练习,当程序出现问题时,要以平静的心态去面对,用细心去发现问题,用耐心去解决问题,在这个过程中锻炼自己解决问题的能力,只有这样的一种解决问题能力的养成,将来在工作中遇到问题才能以良好的素质去解决它,才能在编程的道路上步步为营,踏实前进。
Python+Flask+MysqL的web建设技术过程总结
Python是一种面向对象、直译式计算机程序设计语言。公认的特点是简单、易学、免费、开源等等。对我这种初学者来说,我最为欣赏Python的地方是对字符串操作特别的灵活、采取缩进的方式简单明了、以及简单的语法。以下是从学期初到现在所学习的知识
1、用Python进行简单算数计算。
2、了解turtle库(海龟库),在此环境中练习条件、循环、函数定义的代码敲打,并画出了五角星、同心圆、太阳花、中国国旗等(在国庆还让我们一同展示敲出来的五星红旗)。
3、学习了字符串的基本操作,学会输入字符串,输出代码计算后的结果。还学习了凯撒密码、GDP格式化输出、九九乘法表等简单操作。
4、利用python进行英文词汇统计,组合数据类型练习,用文件形式实现完成的英文词频统计、中文词频统计;利用datetime处理日期和时间,将字符串转化成imestamp与timedelta;到前期收官再次让我们了解管理信息系统概念与基础,理解数据存储的方式如字典、列表、元祖、集合,了解到Web是图形化的和易于导航的、与平台无关、是分布式的、是动态的、是交互的。
5、经过一个学期的学习,实现了Python+Flask+MysqL的web建设,创建了一个宠物交流网站,页面具有宠物交流的信息,能够通过用户登录后进行对于宠物的讨论,还能够发表评论、搜索文章关键字。
运用的工具
增删查改代码
# 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()
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)#加载查询结果
页面展示
首页
注册页
登陆页
个人信息页
全部评论信息页