flask框架项目搭建

一、本文中使用了flask框架中的flask_scriptflask_migrateflask_sqlalchemyflask_wtf表单校验

二、项目目录结构:

|--app.py    [项目入口文件的简称]
|--config.py 存放配置文件
|--exts.py   对app.py项目文件的扩展
|--models.py  存放所有的ORM数据模型
|--manage.py  存放数据库迁移文件

三、具体步骤

  • 创建一个flask项目
  • 创建配置文件config.py代码如下
#!/usr/bin/env python
# encoding: utf-8
DB_URI = "mysql+mysqldb://root:[email protected]:3306/python4?charset=utf8"
SQLALCHEMY_DATABASE_URI = DB_URI
  • 创建app.py文件的扩展文件exts.py,代码如下:
#!/usr/bin/env python
# encoding: utf-8
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
  • 创建数据模型文件models.py代码如下:(简单的创建一个用户表模型)
#!/usr/bin/env python
# encoding: utf-8
from exts import db
import datetime
#创建一个数据模型
class User(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(100),nullable=False)
    password = db.Column(db.String(100))
    create_time = db.Column(db.DateTime,default=datetime.datetime.now())
  • 创建一个数据迁移文件manage.py代码如下:
    在manage.py文件中要注意点:虽然数据模型文件 models.py不使用,但是也要导入,不然不能建立数据迁移
#!/usr/bin/env python
# encoding: utf-8
from exts import db
from flask13_demo import app
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
#导入数据模型
import models

migrate = Migrate(app,db)
manager = Manager(app)
manager.add_command("db",MigrateCommand)

if __name__ == "__main__":
    manager.run()
  • 最后我们在app.py文件中
# coding:utf-8
from flask import Flask
import flask
import config
#导入db
from exts import db
#导入数据模型
from models import User

app = Flask(__name__)
app.debug = True
app.config.from_object(config)
#创建db与app的关系
db.init_app(app)

@app.route('/')
def hello_world():
    return "hello word"

if __name__ == '__main__':
    app.run()
  • 说明:本人不建议直接写app.py文件项目中下面的获取数据,写下面的代码
  • 在项目文件中运行shift + 鼠标右键弹出黑窗口中输入python manage.py db init生成脚本迁移仓库
  • 继续在黑窗口中运行python manage.py db migrate创建脚本迁移文件
  • 继续在黑窗口中运行python manage.py db upgrade创建映射到数据库
  • 补充说明,如果你models.py数据模型中数据结构变动了要重复操作python manage.py db migratepython manage.py db upgrade
  • 测试项目是否搭建成功在app.py文件中补充
@app.route('/')
def hello_world():
    user = User(name='admin',password='123')
    db.session.add(user)
    db.session.commit()
    return 'Hello World!'
  • 查看数据库,数据库添加成功后继续操作,创建一个用户注册的html页面

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册title>
head>
<body>
<div style="width: 400px;">
    <form action="" method="post">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
        <fieldset>
            <legend>用户注册表legend>
            <table>
                <tr>
                    <td><label>用户名:label>td>
                    <td>
                        <input type="text" name="username" placeholder="请输入用户名"/>
                    td>
                tr>
                <tr>
                    <td>
                        <label>密码:label>
                    td>
                    <td>
                        <input type="password" name="password" placeholder="请输入密码"/>
                    td>
                tr>
                <tr>
                    <td>td>
                    <td>
                        <input type="submit" value="提交"/>
                    td>
                tr>
            table>
        fieldset>
    form>
div>
body>
html>
  • 继续补充app.py文件获取表单中数据,提交到数据库
@app.route('/',methods=["GET","POST"])
def hello_world():
    if flask.request.method == "GET":
        return flask.render_template("index.html")
    else:
           name = flask.request.form.get("username")
           password = flask.request.form.get("password")
           print name, password
           # 先查询数据库是否有该用户
           user = db.session.query(User).filter(User.name == name).first()
           if user:
               return u'该用户名已经存在,不能重复创建'
           else:
               user = User(name=name, password=password)
               db.session.add(user)
               db.session.commit()
               return u'创建成功'
  • 扩展利用flask_wtf做表单的校验,在app.py文件中引入相对应的包
#引入form表单的校验
from flask_wtf import FlaskForm,CsrfProtect
from wtforms import StringField
from wtforms.validators import Length

添加CsrfProtectapp的关系

CsrfProtect(app)

创建一个表单校验的类

#创建一个form表单验证的类
class LoginForm(FlaskForm):
    username = StringField(validators=[Length(min=3,max=6,message=u'用户名长度错误')])
    password = StringField(validators=[Length(min=3,max=6,message=u'密码长度错误')])

可以改写函数视图的路由

@app.route('/',methods=["GET","POST"])
def hello_world():
    if flask.request.method == "GET":
        return flask.render_template("index.html")
    else:
        form = LoginForm(flask.request.form)
        if form.validate():
            # name = flask.request.form.get("username")
            # password = flask.request.form.get("password")
            name = form.username.data
            password = form.password.data
            print name, password
            # 先查询数据库是否有该用户
            user = db.session.query(User).filter(User.name == name).first()
            if user:
                return u'该用户名已经存在,不能重复创建'
            else:
                user = User(name=name, password=password)
                db.session.add(user)
                db.session.commit()
                return u'创建成功'
        else:
            print form.errors
            return u'输入信息有错误'

注意要在配置文件中添加一个随机数的token

import os
SECRET_KEY = os.urandom(24)

index.html页面中添加添加一个scrf_token(要在form表单里面)

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

你可能感兴趣的:(python,flask-web开发)