个人学期总结及Python+Flask+MysqL的web建设技术过程

Python+Flask+MysqL的web建设技术过程

1 建立flask框架项目

首先是flask安装(这里默认已经安装好python了),这里我们学习的项目只是简单的用pip install flask的语句安装了flask库,如果你碰到多个项目并且有不同的python版本或外部依赖库,可以参考:安装 — Flask 0.10.1 文档

开发工具上使用了pycharm作为工具,建立项目首先新建项目,选择flask框架进行构建。

个人学期总结及Python+Flask+MysqL的web建设技术过程_第1张图片

2 导航及CSS

在网页前端开发的过程中,我引用了bootstrap的前端架构(其实只用了一些组件)。具体的bootstrap学习可以参考菜鸟教程:Bootstrap 教程 | 菜鸟教程

首先先建立前端html页面,页面导航通过标签

{% block main %}{% endblock %}

子页面:

{% extends 'base.html' %}

{% block title %}
反馈中心
{% endblock %}

{% block main %}
    
{% endblock %}

在父模板中,通过添加 {% block title %}{% endblock %} 标签来连接父模板与子页面的关系,父模板中的 {% block title %}{% endblock %} 标签位置就是子页面的继承父模板后的代码插入位置。父模板的继承用 {% extends 'base.html' %} 这样的标签来继承。

并且也可以看到将后端的数据渲染到模板中则是使用 {{name}} 这样的形式,里面是变量名,用两个花括号包着。

6 flask项目开始

下面是一个简单的开始项目(后端):

from flask import Flask,render_template
url_for('static',filename='js/login.js')
app = Flask(__name__)


@app.route('/')
def index():
    return render_template("base.html")

@app.route('/login')
def login():
    return render_template("login.html")

@app.route('/regis')
def register():
    return render_template("Zhuce.html")

if __name__ == '__main__':
    app.run(debug=True)

app = Flask(__name__) 即初始化一个flask实例对象。
app.run(debug=True) 将debug模式打开,是程序员测试时用的模式,真正使用项目的时候需要把这个模式关掉。

@app.route("/")  在运行实体上绑定URL路由
render_template("Zhuce.html") 返回一个模板文件

url_for('static',filename='js/login.js') 获取“static”文件夹下的静态资源

7 连接mysql数据库,创建用户模型

首先,需要安装好python+flask、MySQL。然后需要根据python的版本下载好MySQL和python的中间件。

下载中间件后用 pip install filename的方法将文件安装到python的Script文件夹中,然后创建一个数据库。

另外写一个config.py的配置文件,写入下面两行代码:

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:数据库密码@数据库地址:3306/数据库名称?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False

然后在主py文件中导入config文件并初始化对象:

import config
from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy

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()

db.create_all()用来执行db的建表操作

8 通过用户模型对数据库进行增删该查

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()

#数据查询方法
User.query.filter(User.username == 'mis1114').first()

#数据添加方法
 user=User(username='mis777789',password='g6666')
 db.session.add(user)
 db.session.commit()

# 数据的修改方法
 user = User.query.filter(User.username=='mis777789').first
 user.password='0.0.0.0'
 db.session.commit()

# 数据的删除方法
user = User.query.filter(User.username=='mis777789').first()
db.session.delete(user)
db.session.commit()

9 完成注册及登陆功能

  1. js文件: onclick函数return True时才提交表单,return False时不提交表单。
  2. html文件:
    1. 中设置 action和method="post"
    2.  中设置 name
  3. 主py文件中:
    1. from flask import  request, redirect, url_for
    2. @app.route('/regist/', methods=['GET', 'POST’])

注册:

@app.route('/regis',methods=['GET','POST'])
def register():
    if request.method=='GET':

        return render_template('Zhuce.html')
    else:

        username=request.form.get('zcid')#与html页面名字相同
        password=request.form.get('zcpassword')
        user=User.query.filter(User.username==username).first()
        if user:
            return 'exit'
        else:
            user=User(username=username,password=password)
            db.session.add(user)
            db.session.commit()
            return redirect(url_for('login'))

登陆:

从flask中导入session,在config配置中加入SECRET_KEY=os.urandom(24),将登陆的用户存入session对象中。

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        username = request.form.get('id')  # 与html页面名字相同
        password = request.form.get('password')
        user = User.query.filter(User.username == username,User.password==password).first()
        if user:
            sessions['username']=username 
            sessions.permanent=True
            return redirect(url_for('index'))
        else:
            return '用户不存在'

登陆与注册的HTML页面:

 
  

10 登陆之后更新导航

 在父模板中使用IF函数判断是否有登陆对象:

        

主py文件中,通过使用上下文处理器,将获取的session中的值以字典的形式返回页面:

@app.context_processor
def mycontext():
    username=session.get('user')
    if username:
        return {'username':username}
    else:
        return {}

 11 发布功能

登陆装饰器:

def log(func):#参数类型为函数
    @wraps(func)
    def wrapper(*args,**kwargs):
        if session.get('user'):
            return func(*args,**kwargs)
        else:
            return redirect(url_for('login'))
    return wrapper

装饰器应用:

应用装饰器,要求在发布前进行登录,登录后可发布。

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

完成发布功能:

@app.route('/tougao',methods=['GET','POST'])
@log
def tougao():
    if request.method=='GET':
         return render_template('tougao.html')
    else:
        title=request.form.get('tougaotitle')
        content=request.form.get('tougaotext')
        id=User.query.filter(User.username==session.get('user')).first().id
        tougao=Tougao(title=title,content=content,userid=id)
        db.session.add(tougao)
        db.session.commit()
        return redirect(url_for('index'))

12 首页列表显示全部问答

首页HTML代码:

主py文件:

@app.route('/')
def index():
    context={
        'touGao':Tougao.query.order_by('-time').all()
    }
    return render_template("index.html",**context)

13从首页投稿到文章详情页

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

@app.route('/pinglun/')
def detial(question_id):
    quest=Question.query.filter(Question.id==question_id).first()
    return render_template('commentdetail.html',que=quest)

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

{{ foo.title}}

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

{% for foo in question %}
    
  • {{ foo.title}}

    {{ foo.detail}}

    {{ foo.creat_time}}
  • {% endfor %}

    建立评论的对象关系映射:

    class Question(db.Model):
        __tablename__ = 'comment'
        id =db.Column(db.Integer,primary_key=True,autoincrement=True)
        author_id=db.Column(db.Integer,db.ForeignKey('uesr.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('comments'))
        author=db.relationship('User',backref=db.backref('comments'))

    14 完成评论功能

    定义评论的视图函数,读取前端页面数据,保存到数据库中。

    @app.route('/pinglun',methods=['POST'])
    @log
    def pinglun():
        pl=request.form.get('pingluntext')
        tougao_id=request.form.get('tougaoid')
        user_id=User.query.filter(User.username==session.get('user')).first().id
        pinglun=Pinglun(userid=user_id,tougaoid=tougao_id,content=pl)
        db.session.add(pinglun)
        db.session.commit()
        context={
            'pingLun':Pinglun.query.order_by('-time').all()
        }
        return render_template(url_for('digital',tougao_id=tougao_id),**context)

    显示所有评论:

    {% extends "base.html" %}
    {% block title %}标题{% endblock %}
    
    {% block main %}
        

    {{ quest.content }}


    评论({{ quest.pinglun|length }}):

    {% endblock %}

    15 个人中心页标签导航

    新页面authorbase.html,用

    •  实现标签页导航。

      authorbase.html继承base.html。重写title,head,main块.将上述

        放在main块中.定义新的块user。

        让上次作业完成的个人中心页面,继承user.html,原个人中心就自动有了标签页导航。

        制作个人中心的三个子页面,重写authorbase.html中定义的user块。

        authorbase:

        {% extends "base.html" %}
        
        
        {% block head %}{% endblock %}
        
        {% block main %}
        
            

        {{ user.username }}

        投稿总数:{{ tougao|length }}   评论数量:{{ pinglun|length }}



        {% block author %}{% endblock %}
        {% endblock %}

        author1:

        {% extends "authorbase.html" %}
        {% block title %}个人中心{% endblock %}
        
        {% block head %}{% endblock %}
        
        {% block author %}
                    
        {% endblock %}

        像上面这个继承authorbase编写三个不同的子网页,然后写一个视图函数带标签页面参数tag,从而达到点击点击不同按钮有不同的页面的效果。

        @app.route('/author//')
        def author(user_id,tag):
            user=User.query.filter(User.id==user_id).first()
            context={
                'user':user,
                'tougao':user.tougao,
                'pinglun':user.pinglun
            }
            if tag=='1':
                return render_template('author1.html', **context)
            elif tag=='2':
                return render_template('author2.html', **context)
            else:
                return render_template('author3.html', **context)

        导航标签链接增加tag参数:

        {{ quest.author.username }} {{ quest.time }}

        有链接到个人中心页面的url增加tag参数:

        {{ session.get('user') }}

        16 实现搜索功能

        准备视图函数search():

        from sqlalchemy import or_
        
        @app.route("/search")
        def search():
            q=request.args.get("q")
            tg=Tougao.query.filter(
                or_(
                    Tougao.title.contains(q),
                    Tougao.content.contains(q)
                )
            ).order_by("-time")
            return render_template("index.html",touGao=tg)

        修改base.html 中搜索输入框所在的:

                

        17 密码保护

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

        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(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):

    你可能感兴趣的:(flask,python,mysql)