码迷,mamicode.com
首页 > 其他好文 > 详细

期末作品检查

时间:2018-01-06 14:09:20      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:host   har   des   面向   必须   tle   信息系统   学习习惯   字符   

一、个人学期总结

这学期我们学习了杜云梅老师的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、完成基本的网页设计

注册页面

技术分享图片

 

登录页面 

技术分享图片

 

发布页面

技术分享图片

 

首页页面

技术分享图片

 

个人中心页面

技术分享图片

 

期末作品检查

标签:host   har   des   面向   必须   tle   信息系统   学习习惯   字符   

原文地址:https://www.cnblogs.com/123hi/p/8213756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!