期末作品检查

一、个人学期总结

        在本学期中在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

 

以上是我这学期的所学。通过missdu的教学,我基本熟悉python的基础操作,感谢杜老师的耐心教导。

posted on 2018-01-05 18:48  051刘佳铃  阅读(276)  评论(0)    收藏  举报