期末作品检查

个人学期总结
       经过一个学期的学习,管理信息系统这门课程真的非常有趣,而且很不可思议。刚开始,一些简单的小练习,让我觉得python类似C语言,但是越学越发现它的不一般,很多的功能只需简单import就能实现。turtle基础练习,原来还能画圆,五角星等等各式各样的图案,涂上你想要的色彩,一幅画即成。在字符串,格式化输出等等的基础练习中,特别在打印99乘法表时,我觉得在表述方面远比C语言简单得多了,代码清晰,还能进行词频统计从而得到了人们想要的数据,这对数据的分析有很大的帮助。通过datatime函数,能准确知道今天的日期,在这年的第几天第几周,距离下一年还有多久,只需要几行代码,就能知道,再也不用花费时间去数数了。进入到网页的建设中,我们经常使用的网页原来是这样形成的,集合了登陆,注册,注销,发布问答,评论功能的html,一串串代码变成了我们可以直观看到的页面,不得不说,计算机语言的强大。头部的导航使用户操作更加方便,CSS样式使得页面更加的美观,JavaScript的登陆注册验证,对输入的文字有了具体的要求,夜间模式的开启与关闭,页面也有了人性化。通过连接mysql数据库,数据存储也不再是难题。当完完整整的做完这个页面后,惊讶于原来我也能成,感叹于信息时代的科技力量。

总结Python+Flask+MysqL的web建设技术过程,标准如下:
即是对自己所学知识的梳理
也可作为初学入门者的简单教程
也可作为自己以后复习的向导
也是一种向外展示能力的途径

一.确定一个目标
搭建一个博客
二.前期准备
1.python语法知识
2.前端基础知识:html,css,javascript,bootstrap
3.web框架:flask学习指南
4.需要下载安装的软件:python,pycharm
5.下载安装MySQL的数据库 https://dev.mysql.com/downloads/mysql/
6.下载安装MySQL-Python的中间件 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
7.观察网页

1.做出一个简单整体首页(base)


2.登陆页面和登陆验证(javasript)

    <div class="box">
        <h2 class="ziti">登录</h2>
        <div class="input_box">
            <input id="uname" type="text" placeholder="请输入用户名">
        </div>
        <div class="input_box">
            <input id="upass" type="password" placeholder="请输入密码">
        </div>
        <div id="error_box"><br></div>
        <div class="input_box">
            <button  onclick="fnLogin()">登录</button>
        </div>
    </div>
    <script>
        function fnLogin() {
            var oUname = document.getElementById("uname")
            var oError = document.getElementById("error_box")
            var oUpass = document.getElementById("upass")
            if(oUname.value.length<6 ){
                oError.innerHTML="用户名至少6位"
            }
            if(oUname.value.length >12){
                oError.innerHTML="用户名最多12位"
            }
            if(oUpass.value.length<6){
                oError.innerHTML="密码至少6位"
            }
            if(oUpass.value.length>12){
                oError.innerHTML="密码最多12位"
            }
        }
    </script>

3.注册页面和注册验证(类似登陆功能)

4.用url_for加载静态文件,用{% %}子模板继承父模板,使各个页面能与首页连接

用url_for加载静态文件:href="{{ url_for('static',filename='css/index.css') }}"

子模板继承父模板 
{% extends 'base.html’ %}
父模板提前定义好子模板可以实现一些自己需求的位置及名称。
<title>{% block title %}{% endblock %}   </title>
{% block head %}{% endblock %}
{% block main %}{% endblock %}

5.连接mysql数据库,创建模型
python文件:如图为用户模型的创建

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)

# 创建用户模型:
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(20),nullable=False)
password = db.Column(db.String(20),nullable=False)
db.create_all()
配置文件:
from flask_sqlalchemy import SQLAlchemy
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost:3306/mis15?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False

6.登陆功能完成,用session记住用户名

py:  @app.route设置methods;GET;POST

session:从`flask`中导入`session`;设置`SECRET_KEY`;操作字典一样操作`session`:增加用户名`session['username']=`username


7.更新登陆注册的导航

用上下文处理器app_context_processor定义函数

  1. 获取session中保存的值
  2. 返回字典


8.发布功能完成

编写要求登录的装饰器

from functools import wraps

def loginFirst(func): #参数是函数

@wraps(func)

      def wrapper(*args, ** kwargs): #定义个函数将其返回

          #要求登录

          return func(*args, ** kwargs)

      return wrapper #返回一个函数


9.制作首页的显示列表

<ul >

  <li>Coffee</li>

  <li>Tea</li>

  <li>Milk</li>

</ul>


10.首页列表显示全部问答

  1. 将数据库查询结果传递到前端页面 Question.query.all()
  2. 前端页面循环显示整个列表。
  3. 问答排序
def index():
    context={
        'questions':Question.query.order_by('-creat_time').all()
    }
<ul class="list-group">
        {% for foo in questions %}
            <li style="padding-left: 0px;padding-right: 10px;box-shadow: #cccccc" class="list-group-item">
                <span class="glyphicon glyphicon-leaf" aria-hidden="true"></span>
                <a href="#">{{foo.author.username}}</a>
                <br>
                <a href="{{ url_for('detail',question_id=foo.id) }}" class="title">{{foo.title}}</a>
                <br>
                <span class="badge">{{foo.creat_time}}</span>
                <p class="detail">{{foo.detail}}</p>
             </li>
        {% endfor %}
</ul>

11.完成问答详情页布局

  1. 包含问答的全部信息
  2. 评论区
  3. 以往评论列表显示区。


12.从首页问答标题跳转到问答详情页

首页标题的标签做带参数的链接;

主PY文件写视图函数,带id参数。 

@app.route('/detail/<question_id>')
def detail(question_id):
    quest = 
    return render_template('detail.html', ques = quest)
      {{ url_for('detail',question_id = foo.id) }}

在详情页将数据的显示在恰当的位置;

{{ ques.title}}
{{ ques.id  }}{{  ques.creat_time }}
{{ ques.author.username }} 
{{ ques.detail }}

建立评论的对象关系映射;类似于用户User和Question

class Comment(db.Model):
    __tablename__='comment'

 


13.完成评论功能

定义评论的视图函数

@app.route('/comment/',methods=['POST'])
def comment():

读取前端页面数据,保存到数据库中

用<input type="hidden" 方法获取前端的"question_id" 

<input type="hidden"  name="question_id" value="{{ques.id}}" />

显示评论次数

<h4>评论:({{ ques.comments|length }}) </h4>

要求评论前登录  参考发布问答前登陆

@loginFrist

14.评论列表显示及排序

显示所有评论

{% for foo in ques.comments %}

所有评论排序

question = db.relationship('Question', backref=db.backref('comments', order_by=creat_time.desc))

显示评论条数

{{ ques.comments|length }}

15.显示个人中心

1.个人中心的页面布局(html文件及相应的样式文件)

2.定义视图函数def usercenter(user_id):

3.向前端页面传递参数

4.页面显示相应数据

     发布的全部问答

    发布的全部评论

    个人信息

5.评论列表显示及排序,个人中心显示


16.更新个人中心标签页导航

新页面user.html,用<ul ><li role="presentation"> 实现标签页导航。子模板继承父模板。

<ul class="nav nav-tabs">
  <li role="presentation"><a href="#">Home</a></li>
  <li role="presentation"><a href="#">Profile</a></li>
  <li role="presentation"><a href="#">Messages</a></li>
</ul>

user.html继承base.html。
重写title,head,main块.
将上述<ul>放在main块中.
定义新的块user,让上次作业完成的个人中心页面,继承user.html,原个人中心就自动有了标签页导航。

 

17.完成个人中心

个人中心—视图函数带标签页面参数tag;个人中心—导航标签链接增加tag参数;个人中心—有链接到个人中心页面的url增加tag参数

@app.route('/usercenter/<user_id>/<tag>')
def usercenter(user_id, tag):
   if tag == ‘1':
       return render_template('usercenter1.html', **context)
<li role=“presentation”><a href=“{{ url_for(‘usercenter’,user_id = user.id,tag = ‘1’) }}">全部问答</a></li>
<a href="{{ url_for('usercenter',user_id = session.get('userid'), tag=1) }}">{{ session.get('user') }}</a>

18.实现搜索功能

  1. 准备视图函数search()
  2. 修改base.html 中搜索输入框所在的
<form action="{{ url_for('search') }}" method="get">

<input name="q" type="text" placeholder="请输入关键字">
  1. 完成视图函数search()
    1. 获取搜索关键字
      q = request.args.get('q’)
    2. 条件查询
      qu = Question.query.filter(Question.title.contains(q)).order_by('-creat_time’)
    3. 加载查询结果:
      return render_template('index.html', question=qu)
    4. 组合条件查询
      from sqlalchemy import or_, and_

19.密码保护 信息的不安全

1.更新User对象,设置对内的_password

class User(db.Model):

    __tablename__ = 'user' 

    _password = db.Column(db.String(200), nullable=False) #内部使用

2.编写对外的password

from werkzeug.security import generate_password_hash, check_password_hash

    @property

    def password(self):  #外部使用,取值

        return self._password

    @password.setter

    def password(self, row_password):#外部使用,赋值

        self._password = generate_password_hash(row_password)

3.密码验证方法:

    def check_password(self, row_password): #密码验证

        result = check_password_hash(self._password,row_password)

        return result

4.登录验证:

        password1 = request.form.get('password')

        user = User.query.filter(User.username == username).first()

        if user:

            if user.check_password(password1):

 

最后完善整个页面,并使之更加美观

学习期间难免会遇到各种各样的问题,先试着在网上查询资料,学会独立排查问题,主要是多多练习,多多尝试。

posted @ 2018-01-06 18:08  003刘淑千  阅读(161)  评论(0编辑  收藏  举报