课时4-虚拟环境
pip install virtualenv #安装虚拟环境
virtualenv venv #创建虚拟环境
..\venv\Scripts\activate #激活虚拟环境
课时10-url反转-url_for
url_for引用视图函数login()
<a href="{{url_for('login')}}">登陆</a>
url_for引用css文件
<link rel="stylesheet" type="text/css" href={{url_for('static',filename='css/index.css')}}">
url_for引用img文件
<img class="logo" src="{{url_for('static',filename='images/zhiliaologo.png')}}">
课时17-继承和使用block
base.html
<!DOCTYPE html>
<html>
<head>
<title>{%block title%}{%endblock%}-知了问答平台</title>
{%block head%}{%endblock%}
</head>
<body>
<nav class="navbar navbar-default"></nav>
<div class="main">
{%block main%}{%endblock%}
</div>
</body>
</html>
index.html
{% extends 'base.html'%}
{%block title%}首页{%endblock%}
{%block head%}
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/index.css')}}">
{%endblock%}
{%block main%}
{%endblock%}
课时21-安装mysql-python,flask-sqlalchemy
python3.6安装mysql-python,flask-sqlalchemy难题解决方案
参照https://www.cnblogs.com/bu1tcat/p/8283742.html
mysql-python安装
pip install MySQL-python
报错之后,到https://pypi.python.org/pypi/mysqlclient/1.3.10 下载驱动
接着安装驱动
pip install mysqlclient-1.3.10-cp36-cp36m-win32.whl
flask-sqlalchemy安装
pip install flask-sqlalchemy
问题解决
驱动放在“学习/python”
课时23-连接数据库
run.py
from flask_sqlalchemy import SQLAlchemy
import config
app.config.from_object(config)
db = SQLAlchemy(app)
db.create_all()
config.py
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = '123456'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'test1'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST
,PORT,DATABASE)
课时24-sqlalchemy表与模型的映射
run.py
# article表:
# create table article (
# id int primary key autoincrement,
# title varchar(100) not null,
# content text not null,
# )
class Article(db.Model):
__tablename__ = 'articlez'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False)
content = db.Column(db.Text,nullable=False)
课时25-flask-sqlalchemy的增删查改
#增
article1 = Article(title='aaa2',content='saiue')
db.session.add(article1)
db.session.commit()
# 查
article1 = Article.query.filter(Article.title == 'aaa2').first()
return render_template('db.html',article1 = article1)
# 改
article1 = Article.query.filter(Article.title == 'aaa2').first()
article1.title = 'new title'
db.session.commit()
# 删
article1 = Article.query.filter(Article.id == 1).first()
db.session.delete(article1)
db.session.commit()
return 'hello'
老师模版
增加:
article1 = Article(title='aaa',content='bbb')
db.session.add(article1)
# 事务
db.session.commit()
# 查
# select * from article where article.title='aaa';
article1 = Article.query.filter(Article.title == 'aaa').first()
print 'title:%s' % article1.title
print 'content:%s' % article1.content
# 改:
# 1. 先把你要更改的数据查找出来
article1 = Article.query.filter(Article.title == 'aaa').first()
# 2. 把这条数据,你需要修改的地方进行修改
article1.title = 'new title'
# 3. 做事务的提交
db.session.commit()
删
1. 把需要删除的数据查找出来
article1 = Article.query.filter(Article.content == 'bbb').first()
# 2. 把这条数据删除掉
db.session.delete(article1)
# 3. 做事务提交
db.session.commit()
课时26-SQLAlchemy外键约束
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(100),nullable=False)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id = db.Column(db.Integer,db.ForeignKey('user.id'))
author = db.relationship('User',backref=db.backref('articles'))
#第一种用法
article = Article(title = '213s',content = 'wes')
article.author = User.query.filter(User.id == 1).first()
#第二种用法
user = User.query.filter(User.id == 1).first()
articles = user.articles #根据db.backref('')里的参数
课时27-多对多关系
model映射关系
article_tag = db.Table('article_tag',
db.Column('article_id',db.Integer,db.ForeignKey('article.id'),primary_key=True),
db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),primary_key=True)
)
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False)
tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))
class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), nullable=False)
实操
article1 = Article(title='aaa')
article2 = Article(title='bbb')
tag1 = Tag(name='111')
tag2 = Tag(name='222')
article1.tags.append(tag1)
article1.tags.append(tag2)
article2.tags.append(tag1)
article2.tags.append(tag2)
db.session.add(article1)
db.session.add(article2)
db.session.add(tag1)
db.session.add(tag2)
db.session.commit()
课时29-分开models和解决循环引用
run.py
#encoding: utf-8
from flask import Flask
import config
from exts import db
from model import Article
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
def hello():
return 'sds'
if __name__ == '__main__':
app.run(debug=True)
model.py
from exts import db
class Article(db.Model):
__tablename = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False)
exts.py
#encoding: utf-8
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
课时30-flask-migrate
run.py
#encoding: utf-8
from flask import Flask
from exts import db
import config
from models import Article
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
# 新建一个article模型,采用models分开的方式
# flask-scrpts的方式
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
manager.py
#encoding: utf-8
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# init
# migrate
# upgrade
# 模型 -> 迁移文件 -> 表
manager = Manager(app)
# 1. 要使用flask_migrate,必须绑定app和db
migrate = Migrate(app,db)
# 2. 把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
实操
# 模型 -> 迁移文件 -> 表
python manager.py db init #初始化,该命令只需执行一次,生成模型
python manager.py db migrate #从模型生成迁移文件
python manager.py db upgrade #从迁移文件映射到表
更改model.py后,需执行以下操作
#模型以初始化,无需再执行init方法
python manager.py db migrate #从模型生成迁移文件
python manager.py db upgrade #从迁移文件映射到表
课时33-Flask的Session操作
run.py
from flask import session
import os
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/')
def index():
session['username'] = 'ljg'
return 'sdawe'
@app.route('/get/')
def get():
return session.get('username')
@app.route('/del/')
def delete():
#session.pop('username') #只清除username
session.clear() #清除所有session
return 'delete'
课时34-设置session的过期时间
run.py
from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days = 7)
@app.route('/')
def index():
session['username'] = 'ljg'
session.permanent = True #如果不设置时间,则过期时间为31天
return 'sdawe'
课时36-get请求和post请求获取参数
from flask import request
@app.route('/search/')
def search():
# arguments
q = request.args.get('q') #get获取信息方法
return u'用户提交的查询参数是:%s' % q
# 默认的视图函数,只能采用get请求
# 如果你想采用post请求,那么要写明
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else: #post获取信息方法
username = request.form.get('username')
password = request.form.get('password')
print 'username:',username
print 'password:',password
return 'post request'
课时37-g全局变量
from flask import g
g.username = 'username'
#g.变量 = 全局变量值
课时 39-before_request钩子函数
@app.context_processor
def my_before_request():
pass
在每次请求前执行
在每个视图函数执行前执行
课时41-导航条的完成
bootstrap中文网 http://www.bootcss.com/
打开bootstrap3中文文档 > 起步
copy第1和第3到.html
因为1、3需要jq的依赖,所以到 https://www.bootcdn.cn/ 下搜索JQuery
引用min版到.html文件即可完成CDN加速
课时46-注册功能完成
注意事项:
run.py要添加db.init_app(app),否则会有如下报错,参考课程课时30