知了课堂Python Flask零基础到项目实战系列视频的全部笔记,现整理在下,视频地址:css
笔记目录:python
>>> import flask >>> print flask.__version__
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKsmysql
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKs#3linux
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKs#5nginx
URL是Uniform Resource Locator的简写,统一资源定位符。web
一个URL由如下几部分组成:sql
scheme://host:port/path/?query-string=xxx#anchor
scheme:表明的是访问的协议,通常为http或者https以及ftp等。
host:主机名,域名,好比www.baidu.com。
port:端口号。当你访问一个网站的时候,浏览器默认使用80端口。
path:查找路径。好比:www.jianshu.com/trending/now,后面的trending/now就是path。
query-string:查询字符串,好比:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。
anchor:锚点,后台通常不用管,前端用来作页面定位的。
web服务器:负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS.
应用服务器:负责处理逻辑的服务器。好比php、python的代码,是不能直接经过nginx这种web服务器来处理的,只能经过应用服务器来处理,常见的应用服务器有uwsgi、tomcat等。
web应用框架:通常使用某种语言,封装了经常使用的web功能的框架就是web应用框架,flask、Django以及Java中的SSH(Structs2+Spring3+Hibernate3)框架都是web应用框架。
flask程序代码的详细解释:
```
# 从flask这个框架中导入Flask这个类
from flask import Flask
# 初始化一个Flask对象
# Flaks()
# 须要传递一个参数__name__
# 1. 方便flask框架去寻找资源
# 2. 方便flask插件好比Flask-Sqlalchemy出现错误的时候,好去寻找问题所在的位置
app = Flask(name)
```
# @app.route是一个装饰器
# @开头,而且在函数的上面,说明是装饰器
# 这个装饰器的做用,是作一个url与视图函数的映射
# 127.0.0.1:5000/ -> 去请求hello_world这个函数,而后将结果返回给浏览器
@app.route('/')
def hello_world():
return '我是第一个flask程序'
# 若是当前这个文件是做为入口程序运行,那么就执行app.run()
if name == 'main':
# app.run()
# 启动一个应用服务器,来接受用户的请求
# while True:
# listen()
app.run()
```
python
文件,程序会自动加载,不须要手动从新启动服务器。config.py
文件app
中,示例代码以下:import config app.config.from_object(config)
SECRET_KEY
和SQLALCHEMY
这些配置,都是在这个文件中。@app.route('/article/<id>') def article(id): return u'您请求的参数是:%s' % id
from flask import redirect,url redirect(url_for('login'))
url_for(视图函数名称)
能够反转成url。url_for('static',filename='路径')
static
文件夹中开始寻找,因此不须要再写static
这个路径了。css
文件,能够加载js
文件,还有image
文件。第一个:加载css文件 <link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}"> 第二个:加载js文件 <script src="{{ url_for('static',filename='js/index.js') }}"></script> 第三个:加载图片文件 <img src="{{ url_for('static',filename='images/zhiliao.png') }}" alt="">
?
的形式来指定key和value的。form data
的形式发送给服务器的。flask.request.args
来获取。flask.request.form
来获取。method='post'
,而且要指定action='/login/'
。<form action="{{ url_for('login') }}" method="post"> <table> <tbody> <tr> <td>用户名:</td> <td><input type="text" placeholder="请输入用户名" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="text" placeholder="请输入密码" name="password"></td> </tr> <tr> <td></td> <td><input type="submit" value="登陆"></td> </tr> </tbody> </table> </form>
g:global
key
会被模板中当成变量来渲染。cookie
出现的缘由:在网站中,http请求是无状态的。也就是说即便第一次和服务器链接后而且登陆成功后,第二次请求服务器依然不能知道当前请求是哪一个用户。cookie的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,而后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器经过浏览器携带的数据就能判断当前用户是哪一个了。cookie
给浏览器,那么浏览器下次再请求相同的服务器的时候,就会自动的把cookie
发送给浏览器,这个过程,用户根本不须要管。cookie
是保存在浏览器中的,相对的是浏览器。session
介绍:session和cookie的做用有点相似,都是为了存储用户相关的信息。不一样的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有必定的弊端,就是会占用服务器的资源,但如今服务器已经发展至今,一些session信息仍是绰绰有余的。session
的好处:
session_id
,服务器将session_id
和敏感数据作一个映射存储在session
(在服务器上面)中,更加安全。session
能够设置过时时间,也从另一方面,保证了用户的帐号安全。session
中,而后再把session
存放到cookie
中,下次请求的时候,再从浏览器发送过来的cookie
中读取session
,而后再从session
中读取敏感数据,并进行解密,获取最终的用户数据。session
机制,能够节省服务器的开销,由于把全部的信息都存储到了客户端(浏览器)。session
放到cookie
中,通过加密,也是比较安全的,这点你们放心使用就能够了。session
须要从flask
中导入session
,之后全部和sessoin
相关的操做都是经过这个变量来的。session
须要设置SECRET_KEY
,用来做为加密用的。而且这个SECRET_KEY
若是每次服务器启动后都变化的话,那么以前的session
就不能再经过当前这个SECRET_KEY
进行解密了。session
的时候,跟操做字典是同样的。session
:session['username']
。session.pop('username')
或者del session['username']
。session
:session.clear()
session
:session.get('username')
app.config
设置PERMANENT_SESSION_LIFETIME
来更改过时时间,这个值的数据类型是datetime.timedelay
类型。templates
文件夹下flask
中导入render_template
函数。render_template
函数,渲染模板。注意:只须要填写模板的名字,不须要填写templates
这个文件夹的路径。render_template
函数中添加关键字参数就能够了。render_template
中,{{params}}
{{params.property}}
的形式,或者是使用{{params['age']}}
.{{ avatar|default('xxx') }}
经常使用的过滤器:
abs(value):返回一个数值的绝对值。示例:-1|abs
default(value,default_value,boolean=false):若是当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')——若是name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,若是想使用python的形式判断是否为false,则能够传递boolean=true。也可使用or来替换。
escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。示例:content|escape或content|e。
first(value):返回一个序列的第一个元素。示例:names|first
format(value,*arags,**kwargs):格式化字符串。好比:
{{ "%s" - "%s"|format('Hello?',"Foo!") }}
将输出:Helloo? - Foo!
last(value):返回一个序列的最后一个元素。示例:names|last。
length(value):返回一个序列或者字典的长度。示例:names|length。
join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。
safe(value):若是开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
int(value):将值转换为int类型。
float(value):将值转换为float类型。
lower(value):将字符串转换为小写。
upper(value):将字符串转换为小写。
replace(value,old,new): 替换将old替换为new的字符串。
truncate(value,length=255,killwords=False):截取length长度的字符串。
striptags(value):删除字符串中全部的HTML标签,若是出现多个空格,将替换成一个空格。
trim:截取字符串前面和后面的空白字符。
string(value):将变量转换成字符串。
wordcount(s):计算一个长字符串中单词的个数。
{% if xxx %} {% else %} {% endif %}
python
同样,可使用items()
、keys()
、values()
、iteritems()
、iterkeys()
、itervalues()
{% for k,v in user.items() %} <p>{{ k }}:{{ v }}</p> {% endfor %}
python
同样。{% for website in websites %} <p>{{ website }}</p> {% endfor %}
{% extends 'base.html' %}
mysqladmin -uroot password [password]
sudo pip install mysql-python
。http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
下载MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
,而后在命令行中,进入到MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
所在的目录,输入如下命令进行安装:pip install MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
flask-sqlalchemy
:sudo pip install flask-sqlalchemy
。from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app)
设置配置信息:在config.py
文件中添加如下配置信息:
```
# dialect+driver://username:password@host:port/database
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_demo1'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST
,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
```
app
文件中,添加配置文件:app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app)
作测试,看有没有问题:
db.create_all()
若是没有报错,说明配置没有问题,若是有错误,能够根据错误进行修改。
db.Model
,而后须要映射到表中的属性,必须写成db.Column
的数据类型。db.Integer
表明的是整形.db.String
表明的是varchar
,须要指定最长的长度。db.Text
表明的是text
。primary_key
:表明的是将这个字段设置为主键。autoincrement
:表明的是这个主键为自增加的。nullable
:表明的是这个字段是否能够为空,默承认觉得空,能够将这个值设置为False
,在数据库中,这个值就不能为空了。db.create_all
来将模型真正的建立到数据库中。# 增长: 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()
外键:
```
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'))```
author = db.relationship('User',backref=db.backref('articles'))
解释:
Article
这个模型添加一个author
属性,能够访问这篇文章的做者的数据,像访问普通模型同样。backref
是定义反向引用,能够经过User.articles
访问这个模型所写的全部文章。class
的方式实现,只能经过db.Table
的方式实现。tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))
须要使用一个关键字参数secondary=中间表
来进行关联。添加数据:
```
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)
访问数据:
article1 = Article.query.filter(Article.title == 'aaa').first() tags = article1.tags for tag in tags: print tag.name
pip install flask-script
来进行安装。manage.py
中写命令,那么在终端就只须要python manage.py command_name
就能够了。python manage.py db init
。例子:
```
from flask_script import Manager
from flask_script_demo import app
from db_scripts import DBManager
manager = Manager(app)
```
# 和数据库相关的操做,我都放在一块儿
@manager.command
def runserver():
print '服务器跑起来了!!!!!'
manager.add_command('db',DBManager)
有子命令的例子:
```
#encoding: utf-8
from flask_script import Manager
DBManager = Manager()
@DBManager.command
def init():
print '数据库初始化完成'
@DBManager.command
def migrate():
print '数据表迁移成功'
```
models
以及解决循环引用:db
放在一个单独的文件中,切断循环引用的线条就能够了。db.create_all
在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,而后从新运行db.craete_all
才会从新映射,这样不符合咱们的需求。所以flask-migrate就是为了解决这个问题,她能够在每次修改模型后,能够将修改的东西映射到数据库中。pip install flask-migrate
进行安装就能够了。flask_migrate
必须借助flask_scripts
,这个包的MigrateCommand
中包含了全部和数据库相关的命令。flask_migrate
相关的命令:
python manage.py db init
:初始化一个迁移脚本的环境,只须要执行一次。python manage.py db migrate
:将模型生成迁移文件,只要模型更改了,就须要执行一遍这个命令。python manage.py db upgrade
:将迁移文件真正的映射到数据库中。每次运行了migrate
命令后,就记得要运行这个命令。manage.py
文件中,若是没有导入进去,就不会映射到数据库中。manage.py
的相关代码:
```
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() ```