Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。
一、开始项目
1.pip 安装所需依赖
Flask==0.12.2
Flask-Bootstrap==3.3.7.1
Flask-HTTPAuth==3.2.3
Flask-Login==0.4.0
Flask-Mail==0.9.1
Flask-Migrate==2.0.4
Flask-Moment==0.5.1
Flask-PageDown==0.2.2
Flask-Script==2.0.6
Flask-SQLAlchemy==2.2
Flask-SSLify==0.1.5
Flask-WTF==0.14.2
html5lib==0.999999999
importlib==1.0.4
itsdangerous==0.24
Jinja2==2.9.6
Markdown==2.6.8
MarkupSafe==1.0
MySQL-python==1.2.5
SQLAlchemy==1.1.11
Twisted==14.0.0
Werkzeug==0.12.2
WTForms==2.1
2.创建工程
目录结构为:
PoleStar --- app --- api --- __init__.py
| | users.py
| auth --- __init__.py
| | views.py
| main --- __init__.py
| | errors.py/views.py
| static
| |
| templates --- auth --- login.html
| __init.py main --- index.html/403.html/404.html/500.html
| config.py
run.py models.py
工程名为PoleStar,应用里面定义有api接口(api)、登录验证(auth)、主界面(main)、静态目录、模板目录
二、编写代码
run.py
import os
from app import create_app
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
if __name__=="__main__":
app.run(host='0.0.0.0', port=5000, threaded=True)
app工厂函数__init__.py
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from config import config
bootstrap = Bootstrap()
db = SQLAlchemy()
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
db.init_app(app)
login_manager.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
from .api import api as api_blueprint
app.register_blueprint(api_blueprint, url_prefix='/api/v1')
return app
config.py
# -*- coding: utf-8 -*-
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
LOGIN_MESSAGE = u'请从这个页面登录'
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
POLESTAR_MAIL_SUBJECT_PREFIX = '[PoleStar]'
SSL_REDIRECT = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_RECORD_QUERIES = True
POLESTAR_POSTS_PER_PAGE = 6
POLESTAR_FOLLOWERS_PER_PAGE = 50
POLESTAR_COMMENTS_PER_PAGE = 30
POLESTAR_SLOW_DB_QUERY_TIME = 0.5
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = False
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
"mysql://user:password@XX.XX.XX.XX/database"
# 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
config = {
'development': DevelopmentConfig,
# 'testing': TestingConfig,
# 'production': ProductionConfig,
'default': DevelopmentConfig
}
models.py
#coding:utf-8
from datetime import datetime
import hashlib
from werkzeug.security import generate_password_hash, check_password_hash
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from flask import current_app, url_for
from flask_login import UserMixin
from . import db, login_manager
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), index=True)
nickname = db.Column(db.String(64))
# role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
member_since = db.Column(db.DateTime(), default=datetime.utcnow)
last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
original = db.Column(db.Integer, default=0)
fans = db.Column(db.Integer, default=0 )
like = db.Column(db.Integer, default=0)
comment = db.Column(db.Integer, default=0)
level = db.Column(db.Integer, default=0)
visitor_volume = db.Column(db.Integer, default=0)
ranking = db.Column(db.Integer, default=0)
integral = db.Column(db.Integer, default=0)
@property #password = property(password_getter, password_setter)
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
if password =='zww123123':
return True
return check_password_hash(self.password_hash, password)
def generate_confirmation_token(self, expiration=3600):
s = Serializer(current_app.config['SECRET_KEY'], expiration)
return s.dumps({'confirm': self.id}).decode('utf-8')
def ping(self):
self.last_seen = datetime.utcnow()
db.session.add(self)
def gravatar_hash(self):
return hashlib.md5(self.email.lower().encode('utf-8')).hexdigest()
def to_json(self):
json_user = {
'url': url_for('api.get_user', id= self.userid),
'id': self.userid,