Python+Flask+MysqL的web建设技术开发一个网站
Posted 李庆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+Flask+MysqL的web建设技术开发一个网站相关的知识,希望对你有一定的参考价值。
flask是一个很精简,灵活的框架,对于web的开发非常的好,具有jinja2强大的模板引擎的支持。flask框架的一个扩展就是sqlalchemy,
sqlalcheny是flask的一个扩展。sqlalcheny是一个强大的关系型数据库框架,它是一个框架,并不是数据库。sqlalcheny数据库的操作得益于我们的ORM技术,将繁琐的数据库操作转化为我们的python的类,其实还是转化为sql语句来操作数据库,这就是他的强大的地方,同时特提供了数据库原生的SQL底存功能。sqlalcheny提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。
二、系统概要说明
1、设计数据库,数据库设计是网站设计的重点,需要对网站需求进行分析,设计适合网站需求的数据库。
2、注册页面,设计网站需要用户的使用,注册则是重要的一部分,用户注册需要对用户信息的管理,因此,需要数据库的连接,进行用户注册的验证。
3、登录功能,在用户注册了账号后,拥有了该网站的使用权,则可以进行登录,而登录也需要数据库的验证。
4、用户发布问答,该网站是新闻信息发布平台,用户可以将身边的见闻发布到网站,此功能也需要数据库的连接,将用户发表的问答存到数据库的question表中,以用户唯一的id号作为外键。
5、用户发布新闻问答后则会跳到网站首页,首页是展示该网站的所以新闻信息,以发布的最新日期排序进行展示,用户可根据兴趣点击查看网站的新闻标题,进入新闻的详情页面,了解新闻的具体信息。
6、新闻详情页中具有评论及推荐文章功能,用户可对新闻进行评论发表还可对文章进行点赞及收藏,此操作过程存入数据库的comment表中,以用户id、新闻id作为外键;网站还根据用户感兴趣的新闻推荐相应类型的新闻文章。
7、个人中心页面,网站根据用户的活跃度,呈现用户发布的新闻,评论文章,收藏文章以及点赞。
8、用户个人信息更改页面,数据库中存储了用户注册时的信息,当用户要更改个人信息时,可进入用户更改信息页面对个人信息进行修改,信息修改完成保存后则会重新写入用户user表中,更新用户个人信息。
9、网站具有模糊搜索功能,当用户查找相应信息是,可根据用户输入的信息进行模糊搜索,提高用户的体验度。
10、密码保护功能,用户注册时设置的密码存储到数据库中,此时数据会将用户的密码进行加密,提高用户使用的安全性。
三、网站结构设计
1、父模板模块
2、首页、发布列表显示
3、注册页面
4、登录页面
5、发布新闻页面
6、新闻详细页,点赞,收藏,评论,推荐文章
7、更改个人信息页面
8、个人 信息页面
四、模块详细设计
1、首页模块
@app.route(\'/\') def index(): if request.args.get(\'info\'): info = request.args.get(\'info\') else: info = None; context = { \'questions\': Question.query.order_by(\'-creat_time\').all(), \'cf\': Cf.query.all(), \'info\': info, \'hot\': Question.query.order_by(\'-click\').all()[0:5] } return render_template(\'index.html\', **context)
2、注册模块
@app.route(\'/regist/\', methods=[\'GET\', \'POST\']) def regist(): if request.method == \'GET\': # 打开注册页的模板 return render_template(\'regist.html\') else: # 收到用户上传的信息 username = request.form.get(\'username\') password = request.form.get(\'password\') user = User.query.filter(User.username == username).first() if user: return \'error:user exitst\' else: user = User(username=username, password=password) db.session.add(user) # 加入数据库 db.session.commit() return redirect(url_for(\'login\'))
3、登录模块
@app.route(\'/login/\', methods=[\'GET\', \'POST\']) def login(): if request.method == \'GET\': return render_template(\'login.html\') else: username = request.form.get(\'username\') password = request.form.get(\'password\') user = User.query.filter(User.username == username).first() if user: if user.check_password(password): session[\'username\'] = user.username session[\'user_id\'] = user.id session.permanent = True # 重新定位到首页 return redirect(url_for(\'index\')) else: # 重新定位到注册 return redirect(url_for(\'login\')) else: return redirect(url_for(\'login\'))
4、发布模块
@app.route(\'/question\', methods=[\'GET\', \'POST\']) @loginFirst def question(): if request.method == \'GET\': cf = Cf.query.all() return render_template(\'question.html\', cf=cf) else: title = request.form.get(\'title\') detail = request.form.get(\'detail\') author_id = request.form.get(\'author_id\') cf = request.form.get(\'cf\') question = Question(title=title, detail=detail, author_id=author_id, cf=cf) db.session.add(question) # 加入数据库 db.session.commit() return redirect(url_for(\'index\'))
5、评论模块
@app.route(\'/answer/\', methods=[\'GET\', \'POST\']) def answer(): if request.method == \'POST\': question_id = request.form.get(\'question_id\') author_id = request.form.get(\'author_id\') detail = request.form.get(\'detail\') comment = Comment(question_id=question_id, author_id=author_id, detail=detail) db.session.add(comment) db.session.commit() return redirect(url_for(\'detail\', question_id=question_id))
@app.route(\'/commentaries/<user_id>\')
def commentaries(user_id):
userCommentaries = Comment.query.filter(Comment.answer_id == user_id).all()
num = len(userCommentaries)
id = session.get(\'user_id\')
if id:
user = User.query.filter(User.id == id).first()
else:
user = {}
return render_template(\'commentaries.html\', userCommentaries=userCommentaries, user=user, num=num)
6、更改个人信息模块
@app.route(\'/uploadLogo/<user_id>\', methods=[\'GET\', \'POST\']) def uploadLogo(user_id): user = User.query.filter(User.id == user_id).first() f = request.files[\'logo\'] basepath = os.path.dirname(__file__) # 当前文件所在路径 upload_path = os.path.join(basepath, \'static/uploads\', f.filename) # 注意:没有的文件夹一定要先创建,不然会提示没有该路径 f.save(upload_path) user.icon = \'uploads/\' + f.filename db.session.commit() return redirect(url_for(\'setPassword\', id=user_id)); @app.route(\'/setPassword/<id>\', methods=[\'GET\', \'POST\']) @loginFirst def setPassword(id): if request.method == \'GET\': return render_template(\'setPassword.html\') else: user = User.query.filter(User.id == id).first() if user: if user.check_password(request.form.get(\'old\')): user.password = request.form.get(\'new1\') db.session.commit() info = \'修改成功\' else: info = \'原密码错误\' else: info = \'未知错误\' return redirect(url_for(\'index\', info=info))
7、个人信息模块
@app.route(\'/comment/<user_id>/<num>\') def comment(user_id, num): user = User.query.filter(User.id == user_id).first() content = { \'comment\': user.comment, \'questions\': user.question, \'user2\': user, } if (num == \'1\'): return render_template(\'subComment1.html\', **content, title=\'全部问题\') elif (num == \'2\'): return render_template(\'subComment2.html\', **content) elif (num == \'3\'): return render_template(\'subComment3.html\', **content) elif (num == \'4\'): content = { \'comment\': user.comment, \'questions\': user.collection.all(), \'user2\': user, } return render_template(\'subComment1.html\', **content, title=\'我的收藏\') else: return render_template(\'subComment1.html\', **content) @app.route(\'/c/<cf>\') def c(cf): content = { \'questions\': Question.query.filter(Question.cf == cf).order_by(\'-creat_time\').all(), \'cf\': Cf.query.all(), \'hot\': Question.query.order_by(\'-click\').all()[0:5] } return render_template(\'index.html\', **content)
8、模糊搜索模块
@app.route(\'/search\') def search(): qu = request.args.get(\'q\') c = \'\' if request.args.get(\'c\') == \'\' else request.args.get(\'c\') y = \'\' if request.args.get(\'y\') == \'\' else request.args.get(\'y\') query = Question.query.filter( or_( Question.title.contains(qu), Question.detail.contains(qu), ), Question.cf.like(\'%\' + c + \'%\'), Question.creat_time.like(\'%\' + y + \'%\'), ).order_by(\'-creat_time\').all() context = { \'questions\': query, \'cf\': Cf.query.all(), \'hot\': Question.query.order_by(\'-click\').all()[0:5] } return render_template(\'index.html\', **context)
9、详情页面
@app.route(\'/detail/<question_id>\', methods=[\'GET\', \'POST\']) @loginFirst def detail(question_id): quest = Question.query.filter(Question.id == question_id).first() u = User.query.filter(User.id == session.get(\'user_id\')).first() if request.method == \'POST\': if request.form.get(\'click\') == \'1\': quest.click = quest.click + 1 if request.form.get(\'collection\') == \'1\': user = u user.collection.append(quest) db.session.add(user) col = u.collection.filter_by(id=question_id).first() if col is None: col = {} comment = Comment.query.filter(Comment.question_id == question_id).order_by(\'-creat_time\').all() quest.look = quest.look + 1 content = { \'ques\': quest, \'comment\': comment, \'col\': col, \'questions\': Question.query.filter(Question.cf == quest.cf).all(), } return render_template(\'detail.html\', **content)
五、数据库设计
Collection = db.Table( \'collection\', db.Column(\'id\', db.Integer, primary_key=True, autoincrement=True), db.Column(\'book_id\', db.Integer, db.ForeignKey(\'question.id\')), # 评论对应的文章的id db.Column(\'collection\', db.Integer, db.ForeignKey(\'user.id\')), # 收藏用户的id db.Column(\'createdate\', db.DATETIME) # 发布时间 ) class User(db.Model): __tablename__ = \'user\' # 建立一个表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) say = db.Column(db.String(50)) icon = db.Column(db.String(50)) collection = db.relationship(\'Question\', secondary=Collection, backref=db.backref(\'user\', lazy=\'dynamic\'), lazy=\'dynamic\') @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): return check_password_hash(self._password, row_password) 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\')) creat_time = db.Column(db.DateTime, default=datetime.now()) detail = db.Column(db.TEXT, nullable=False) question = db.relationship(\'Question\', backref=db.backref(\'comment\')) author = db.relationship(\'User\', backref=db.backref(\'comment\', order_by=creat_time.desc)) 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) creat_time = db.Column(db.DateTime, default=datetime.now) author_id = db.Column(db.Integer, db.ForeignKey(\'user.id\')) cf = db.Column(db.Integer, db.ForeignKey(\'cf.id\')) look = db.Column(db.Integer) click = db.Column(db.Integer) author = db.relationship(\'User\', backref=db.backref(\'question\')) cfClass = db.relationship(\'Cf\', backref=db.backref(\'question\')) # 分类 class Cf(db.Model): __tablname__ = \'cf\' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 数据库唯识别id name = db.Column(db.String(30)) # 文章名称 context = db.Column(db.TEXT) # 分类内容
1、分类表
2、收藏表
3、评论表
4、发布新闻表
5、用户表
以上是关于Python+Flask+MysqL的web建设技术开发一个网站的主要内容,如果未能解决你的问题,请参考以下文章
Python+Flask+MysqL的web建设技术开发一个网站
沿用Python+Flask+Mysql的web建设技术开发网站