站在世界的尽头,再回首,世界如此温柔,纵然风狂雨骤,再也不害怕无路可退。
目录结构
│ 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'>