站在世界的尽头,再回首,世界如此温柔,纵然风狂雨骤,再也不害怕无路可退。

目录结构

│  manage.py        启动文件
│  
└─app            总项目文件夹
    │  models.py    数据库模块
    │  __init__.py     初始化app对象
    │  
    ├─admin        后台管理模块
    │      forms.py    后台表单验证
    │      view.py    后台视图函数
    │        __init__.py 后台创建蓝图
    │      
    ├─home        前台展示模块
    │      forms.py    前台表单验证
    │      view.py    前台视图函数
    │        __init__.py 前台创建蓝图
    │      
    ├─static        静态文件夹/css/js/图片
    └─templates    HTML模板
        ├─admin    管理模板
        └─home        前台模板

蓝图构建

关于蓝图的使用方法传送门

修改app/admin/__init__.py
from flask import Blueprint
admin_print = Blueprint('admin',__name__)
import view

修改app/admin/view.py
sys.path.append('..')
from . import admin_print
@admin_print.route('/')
def index():
    return 'hello word'

修改app/home/__init__.py
from flask import Blueprint
home_print = Blueprint('home',__name__)
import view

修改app/home/view.py
from . import home_print
@home_print.route('/')
def index():
    return 'hello word web'

修改app/__init__.py
from admin import admin_print
from home import home_print
from flask import Flask
app = Flask(__name__,template_folder='templates',static_folder='static')
app.register_blueprint(admin_print,url_prefix='/admin')
app.register_blueprint(home_print)

修改manage.py
import sys
sys.path.append('..')
from app import app
reload(sys)
sys.setdefaultencoding('utf-8')
app.run()

然后运行manage.py,这个时候访问

http://127.0.0.1:5000/  返回  hello word web
http://127.0.0.1:5000/admin/  返回  hello word

数据模型

使用SQLALchemy来创建数据库,数据库模型的功能都写在注释里面。

关于数据库模型的使用方法传送门

首先登录mysql,创建movie数据库。

# -*-coding:utf-8-*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/movie'
# 用于连接数据的数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。

db = SQLAlchemy(app)
# 实例化对象

会员

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 昵称
    pwd = db.Column(db.String(100))  # 密码
    email = db.Column(db.String(100), unique=True)  # 邮箱
    phone = db.Column(db.String(11), unique=True)  # 手机号码
    info = db.Column(db.Text)  # 个性简介
    face = db.Column(db.String(255), unique=True)  # 头像
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 注册时间
    uuid = db.Column(db.String(255), unique=True)  # 唯一标志符
    userlogs = db.relationship('Userlog', backref='user')  # 会员日志外键关系关联
    comments = db.relationship('Comment', backref='user')  # 评论外键关系关联
    moviecols = db.relationship('Moviecol', backref='user')  # 收藏外键关系关联

    def __repr__(self):
    return "<User %r>" % self.name

员登录日志

class Userlog(db.Model):
    __tablename__ = "userlog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登录时间

    def __repr__(self):
    return "<Userlog %r>" % self.id

标签

class Tag(db.Model):
    __tablename__ = "tag"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 标题
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    movies = db.relationship("Movie", backref='tag')  # 电影外键关系关联

    def __repr__(self):
    return "<Tag %r>" % self.name

电影

class Movie(db.Model):
    __tablename__ = "movie"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    title = db.Column(db.String(255), unique=True)  # 标题
    url = db.Column(db.String(255), unique=True)  # 地址
    info = db.Column(db.Text)  # 简介
    logo = db.Column(db.String(255), unique=True)  # 封面
    star = db.Column(db.SmallInteger)  # 星级
    playnum = db.Column(db.BigInteger)  # 播放量
    commentnum = db.Column(db.BigInteger)  # 评论量
    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))  # 所属标签
    area = db.Column(db.String(255))  # 上映地区
    release_time = db.Column(db.Date)  # 上映时间
    length = db.Column(db.String(100))  # 播放时间
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    comments = db.relationship("Comment", backref='movie')  # 评论外键关系关联
    moviecols = db.relationship("Moviecol", backref='movie')  # 收藏外键关系关联

    def __repr__(self):
    return "<Movie %r>" % self.title

上映预告

class Preview(db.Model):
    __tablename__ = "preview"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    title = db.Column(db.String(255), unique=True)  # 标题
    logo = db.Column(db.String(255), unique=True)  # 封面
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
    return "<Preview %r>" % self.title

评论

class Comment(db.Model):
    __tablename__ = "comment"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    content = db.Column(db.Text)  # 内容
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 所属电影
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属用户
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
    return "<Comment %r>" % self.id

电影收藏

class Moviecol(db.Model):
    __tablename__ = "moviecol"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 所属电影
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属用户
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
    return "<Moviecol %r>" % self.id

权限

class Auth(db.Model):
    __tablename__ = "auth"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 名称
    url = db.Column(db.String(255), unique=True)  # 地址
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间

    def __repr__(self):
    return "<Auth %r>" % self.name

角色

class Role(db.Model):
    __tablename__ = "role"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 名称
    auths = db.Column(db.String(600))  # 角色权限列表
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    admins = db.relationship("Admin", backref='role')  # 管理员外键关系关联

    def __repr__(self):
    return "<Role %r>" % self.name

管理员

class Admin(db.Model):
    __tablename__ = "admin"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    name = db.Column(db.String(100), unique=True)  # 管理员账号
    pwd = db.Column(db.String(100))  # 管理员密码
    is_super = db.Column(db.SmallInteger)  # 是否为超级管理员,0为超级管理员
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))  # 所属角色
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加时间
    adminlogs = db.relationship("Adminlog", backref='admin')  # 管理员登录日志外键关系关联
    oplogs = db.relationship("Oplog", backref='admin')  # 管理员操作日志外键关系关联

    def __repr__(self):
    return "<Admin %r>" % self.name

管理员登录日志

class Adminlog(db.Model):
    __tablename__ = "adminlog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 所属管理员
    ip = db.Column(db.String(100))  # 登录IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登录时间

    def __repr__(self):
    return "<Adminlog %r>" % self.id

操作日志

class Oplog(db.Model):
    __tablename__ = "oplog"
    id = db.Column(db.Integer, primary_key=True)  # 编号
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 所属管理员
    ip = db.Column(db.String(100))  # 登录IP
    reason = db.Column(db.String(600))  # 操作原因
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登录时间

    def __repr__(self):
    return "<Oplog %r>" % self.id

创建数据库

if __name__ == "__main__":
    db.create_all()

    role = Role(
    name="超级管理员",
    auths=""
    )
    db.session.add(role)
    db.session.commit()
    from werkzeug.security import generate_password_hash

    admin = Admin(
    name="imoocmovie",
    pwd=generate_password_hash("imoocmovie"),
    is_super=0,
    role_id=1
    )
    db.session.add(admin)
    db.session.commit()

突然变成了一个小新闻页面

事情是这样的,我家的猫今天接了个电话就出门了到现在还没回来,所以视频网站项目没有跟着做了,转而做一个类似新闻的网站,使用的mysql数据库+flask框架+bootstrap框架做一个类似今日头条的网站。

目录结构设计如上面的结构一样。

News/
├── admin
│   ├── forms.py
│   ├── __init__.py
│   └── views.py
├── home
│   ├── forms.py
│   ├── __init__.py
│   └── views.py
├── manage.py
├── models.py
├── static
└── templates

数据库模型设计

简单的每张新闻都必须包含如下数据结构

id:唯一标识符
title:新闻标题
content:新闻内容
author:作者
add_time:创建时间
image:新闻缩略图
type:新闻类型
views_count:阅读量
is_valid:删除标记

创建好了之后随便插入几条数据进去,然后随便查询几条数据测试一下

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author  :langzi
@file    :models.py
@time    :2018/08/{DAY}
@Blog    :www.sxadmin.github.io
"""
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from datetime import datetime
import pymysql
print '开始检查数据库是否运行进行连接'
try:
    coon = pymysql.connect(host='127.0.0.1',user='root',passwd='root',port=3306)
    cur = coon.cursor()
    print 'connect success,try create database'
    cur.execute('create database langzinews')
    coon.commit()
    cur.close()
    coon.close()
except BaseException,e:
    print e

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/langzinews?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


class News(db.Model):
    __tablename__ = 'news'
    id = db.Column(db.Integer,primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), unique=True)
    content = db.Column(db.Text)
    author = db.Column(db.String(20))
    type = db.Column(db.String(10),index=True)
    image = db.Column(db.String(255))
    add_time = db.Column(db.DateTime, default=datetime.now())
    is_valid = db.Column(db.Integer,default=1)
    view_count = db.Column(db.Integer)

    def __repr__(self):
        return '<News:%s>'%self.title.encode('utf-8')

db.create_all()

me = News(title='PEP8规则',content='不要使用 tab 缩进\
使用任何编辑器写 Python,请把一个 tab 展开为 4 个空格\
绝对不要混用 tab 和空格,否则容易出现 IndentationError\
',author='langzi',type='Python',image='/static/image/a.jpg',add_time=datetime.now(),is_valid=1,view_count=100)
me2 = News(title='Python可视化初探',content='pyecharts 是一个用于生成 Echarts 图表的类库。\
Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,\
方便在 Python 中直接使用数据生成图。'
,author='langzi',type='Pyecharts',image='/static/image/ab.jpg',add_time=datetime.now(),is_valid=1,view_count=2000)
# db.session.add(me)
# db.session.commit()
# db.session.add(me2)
# db.session.commit()

res = News.query.filter_by(title='Python可视化初探').first()
print res.content
print res.author
print type(res)

运行结果:

/usr/bin/python2 /home/langzi/PycharmProjects/News/app/models.py
开始检查数据库是否运行进行连接
connect success,try create database
pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。
langzi
<class '__main__.News'>