Flask不同于Django,Django在创建程序时自动得到必要的目录文件,而Flask则只有一个空文件夹,所以关于Flask项目的目录我们需要自行配置。

  首先利用pycharm创建一个项目,在根目录下创建一个app文件夹(app文件)、一个utils文件夹(用于放数据库连接池)、一个manage.py文件和一个settings.py文件。这里我还创建了一个auth文件夹,写了一个验证登录的py文件

  首先,我们要在app文件夹下依次创建一下内容:

    •   static文件夹:用于放静态文件
    •   templates文件夹:用于放置html模板文件
    • views文件夹:用于放置视图函数
    • __init__.py文件:注册app到启动文件,一会儿我们会在这里大做文章
    • models.py文件:用于放置创建表的类

  在__init__.py中,需要做的是引入Flask-SQLAlchemy、创建app、设置配置文件、注册蓝图和注册组件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask from auth.auth import Auth
from flask_session import Session # 1. 引入Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()#实例化SQLAlchemy from .views.account import account
from .views.main import main
from .views.user import user # 3. 导入models中的表
from .models import * #创建app
def create_app():
app = Flask(__name__)
app.debug = True
app.secret_key = 'sdiusdfsdf'#自定义的session秘钥
# 设置配置文件
app.config.from_object('settings.DevelopmentConfig') # 注册蓝图
app.register_blueprint(account)
app.register_blueprint(user)
app.register_blueprint(main) # 注册组件
# Session(app)
Auth(app) # 2. 注册 Flask-SQLAlchemy
# 这个对象在其他地方想要使用
# SQLAlchemy(app)
db.init_app(app) return app
#得到了一个app

app文件夹下的_init__.py

  然后,在启动文件manage.py中导入创建的app,创建自定义命令后写下run

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
被毙掉了
# 5. 创建和删除表
以后执行db.create_all()
以后执行db.drop_all()
新第5步:
安装 pip3 install Flask-Migrate
""" import os
from flask_script import Manager, Server
# 5.1 导入
from flask_migrate import Migrate, MigrateCommand
from app import create_app, db app = create_app()
manager = Manager(app)
# 5.2 创建migrate示例
migrate = Migrate(app, db) @manager.command
def custom(arg):
"""
自定义命令
python manage.py custom 123
:param arg:
:return:
"""
print(arg) @manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd(name, url):
"""
自定义命令
执行: python manage.py cmd -n wupeiqi -u http://www.oldboyedu.com
:param name:
:param url:
:return:
"""
print(name, url) @manager.command
def import_news(path):
"""
批量导入
:param name:
:param url:
:return:
"""
import xlrd
from xlrd.book import Book
from xlrd.sheet import Sheet
from xlrd.sheet import Cell
workbook = xlrd.open_workbook(path)
sheet_names = workbook.sheet_names()
# sheet = workbook.sheet_by_name('工作表1')
sheet = workbook.sheet_by_index(0) # 循环Excel文件的所有行
for row in sheet.get_rows():
# print(row)
# 循环一行的所有列
for col in row:
# 获取一个单元格中的值
print(col.value, end=';')
print('') """
# 数据库迁移命名
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
"""
# 5.3 创建db命令,以后在数据库操作的时候都可使用db
manager.add_command('db', MigrateCommand) """
# 自定义命令
python manage.py runserver
"""
manager.add_command("runserver", Server()) """
生成当前环境的所有依赖: requirements.txt
pip3 freeze > requirements.txt 生成当前程序的所有依赖: requirements.txt
pip3 install pipreqs
pipreqs ./ """ if __name__ == "__main__":
manager.run()

manage.py

  接下来在settings.py文件中配置好相应的数据库信息,在utils文件夹下创建文件,写入数据库连接池的内容

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis class BaseConfig(object):
SESSION_TYPE = 'redis' # session类型为redis
SESSION_KEY_PREFIX = 'session:' # 保存到session中的值的前缀
SESSION_PERMANENT = False # 如果设置为True,则关闭浏览器session就失效。
SESSION_USE_SIGNER = False # 是否对发送到浏览器上 session:cookie值进行加密 SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123@127.0.0.1:3306/flask_cata?charset=utf8"
#数据库用户名:密码@host:port/数据库名?编码
SQLALCHEMY_POOL_SIZE = 2
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1 # 追踪对象的修改并且发送信号
SQLALCHEMY_TRACK_MODIFICATIONS = False class ProductionConfig(BaseConfig):
pass class DevelopmentConfig(BaseConfig):
pass class TestingConfig(BaseConfig):
pass

settings.py

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=5, # 链接池中最多闲置的链接,0和None不限制
maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
ping=0,
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
# host='47.93.4.198',
host='127.0.0.1',#本机host
port=3306,#数据库默认端口即3306
user='root',#数据库用户名
password='',#数据库密码
database='flask_cata',#数据库名
charset='utf8'
)

utils\pool\db_pool.py

"""

# 方式一
# helper = SQLHelper()
# helper.open()
# result = helper.fetchone('select * from users where name=%s and pwd = %s',[request.form.get('user'),request.form.get('pwd'),])
# helper.close()
# 方式二:
# with SQLHelper() as helper:
# result = helper.fetchone('select * from users where name=%s and pwd = %s',[request.form.get('user'),request.form.get('pwd'),])
# if result:
# current_app.auth_manager.login(result['name'])
# return redirect('/index') """ from utils.pool import db_pool
import pymysql class SQLHelper(object):
def __init__(self):
self.conn = None
self.cursor = None def open(self, cursor=pymysql.cursors.DictCursor):
self.conn = db_pool.POOL.connection()
self.cursor = self.conn.cursor(cursor=cursor) def close(self):
self.cursor.close()
self.conn.close() def fetchone(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
result = cursor.fetchone() return result def fetchall(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
result = cursor.fetchall()
return result def __enter__(self):
self.open()
return self def __exit__(self, exc_type, exc_val, exc_tb):
self.close() # with SQLHelper() as obj:
#
# print(obj)
# print('正在执行')

utils\pool\sqlhelper.py

到这里,程序的基本框架就设定好了。

接下来就是具体项目的内容,这里举一个简单的栗子

  在models.py中创建表

"""

# 方式一
# helper = SQLHelper()
# helper.open()
# result = helper.fetchone('select * from users where name=%s and pwd = %s',[request.form.get('user'),request.form.get('pwd'),])
# helper.close()
# 方式二:
# with SQLHelper() as helper:
# result = helper.fetchone('select * from users where name=%s and pwd = %s',[request.form.get('user'),request.form.get('pwd'),])
# if result:
# current_app.auth_manager.login(result['name'])
# return redirect('/index') """ from utils.pool import db_pool
import pymysql class SQLHelper(object):
def __init__(self):
self.conn = None
self.cursor = None def open(self, cursor=pymysql.cursors.DictCursor):
self.conn = db_pool.POOL.connection()
self.cursor = self.conn.cursor(cursor=cursor) def close(self):
self.cursor.close()
self.conn.close() def fetchone(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
result = cursor.fetchone() return result def fetchall(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
result = cursor.fetchall()
return result def __enter__(self):
self.open()
return self def __exit__(self, exc_type, exc_val, exc_tb):
self.close() # with SQLHelper() as obj:
#
# print(obj)
# print('正在执行')

models.py

  通过python manage.py db init      python manage.py db migrate      python manage.py db upgrade三条命令进行数据库迁移创建表,得到migrations文件夹

  在views文件夹下创建视图函数,并配置路由。在templates文件夹下创建模板html,在static下创建静态文件,基本项目就成型了

views:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Blueprint, request, render_template, redirect, session, current_app
from app import models
from app import db
from sqlalchemy import orm account = Blueprint('account', __name__) @account.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET': """
执行SQL
方式一:
result = db.session.query(models.User.id,models.User.name).all()
db.session.remove()
方式二:
result = models.Users.query.all()
"""
"""
示例:
# 通配符
ret = db.session.query(Users).filter(Users.name.like('e%')).all()
ret = db.session.query(Users).filter(~Users.name.like('e%')).all() # 限制
ret = db.session.query(Users)[1:2] # 排序
ret = db.session.query(Users).order_by(Users.name.desc()).all()
ret = db.session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() db.session.remove() """
return render_template('login.html')
else:
return render_template('login.html')

account.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Blueprint, request, render_template, redirect main = Blueprint('main', __name__) @main.route('/index')
def index():
# with SQLHelper() as helper:
# user_list = helper.fetchall('select * from users',[]) return render_template('index.html')

main.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Blueprint user = Blueprint('user', __name__) @user.route('/users')
def users():
return 'users'

user.py

templates:

{% extends 'layout.html' %}

{% block title %}首页{% endblock %}

{% block body %}
<table>
<h1>欢迎登录:{{ session.get('user') }}</h1>
<ul>
{% for row in user_list %}
<li>{{ row }}</li>
{% endfor %}
</ul>
</table>
{% endblock %}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<!-- <link rel="stylesheet" href="/static/css/commons.css" /> -->
<link rel="stylesheet" href="{{ url_for('static',filename='css/commons.css') }}" /> {% block css %}{% endblock %}
</head>
<body>
<div class="pg-header"></div>
<div class="pg-body">
{% block body %}{% endblock %}
</div> {% block js %}{% endblock %}
</body>
</html>

layout.html(基板)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>

login.html

附:

alembic==0.9.6
blinker==1.4
certifi==2017.11.5
chardet==3.0.4
click==6.7
DBUtils==1.2
docopt==0.6.2
Flask==0.12.2
Flask-Migrate==2.1.1
Flask-Script==2.0.6
Flask-Session==0.3.1
Flask-SQLAlchemy==2.3.2
idna==2.6
itsdangerous==0.24
Jinja2==2.10
Mako==1.0.7
MarkupSafe==1.0
pipreqs==0.4.9
PyMySQL==0.8.0
python-dateutil==2.6.1
python-editor==1.0.3
PyTyrion==1.0.1
requests==2.18.4
six==1.11.0
SQLAlchemy==1.2.0
urllib3==1.22
Werkzeug==0.14.1
WTForms==2.1
xlrd==1.1.0
yarg==0.1.9

requirement.txt

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import request, session,redirect # 登录成功时 _request_ctx_stack.top.user = user class Auth(object):
def __init__(self, app=None):
self.app = app
if app:
self.init_app(app) def init_app(self, app):
app.auth_manager = self app.before_request(self.check_login)
app.context_processor(self.auth_context_processor) def auth_context_processor(self):
name = session.get('user')
return dict(current_user=name) def check_login(self):
# print(request.url)
# print(request.path)
if request.path == '/login':
return None if session.get('user'):
return None
return redirect('/login') def permission(self):
pass def login(self,data):
session['user'] = data

auth.py

  

  

Flask项目示例目录的更多相关文章

  1. Django和Flask框架学习目录

    Django目录 Django基本配置与URLconf DjangoMTV模型之视图层views及模板层template DjangoMTV模型之model层——ORM操作数据库(基本增删改查) Dj ...

  2. python2.7环境下的flask项目导入模块失败解决办法

    如下一个flask项目的目录: 这个flask项目在python3.6环境下可以正常启动,但是在python2.7环境下如下报错提示: 提醒模块找不到.如下解决方法: 只需要在views目录里面加一个 ...

  3. Flask 项目目录蓝图

    Flask 项目目录蓝图 小型项目 大型项目 定义蓝图 注册蓝图 template_folder="XXX" 参数是指 模板文件夹 注意 优先是找templates 在找自己指定的 ...

  4. flask 项目的开发经验总结

    已经开发了几个flask项目, 是时候总结一下了, 这里涉及到项目源码的组织, 常用的包, 源码示例. =========================需要的 python 包有:========= ...

  5. Flask项目之手机端租房网站的实战开发(四)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  6. Flask学习之旅--Flask项目部署

    一.写在前面 Flask 作为一个轻量级的 Web 框架,具有诸多优点,灵活方便,扩展性强,开发文档也很丰富.在开发调试的过程中,我们往往会使用 Flask 自带的 Web 服务器,但如果要投入到生产 ...

  7. 应用程序框架实战三十八:项目示例VS解决方案的创建(一)

    进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的 ...

  8. 【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中

    项目输出目录(bin/debug|release)中经常是这个样子: main.exemain.pdb a.dll a.xml b.dll b.pdb b.xml ... 其中xml是同名dll的注释 ...

  9. Python框架 Flask 项目实战教程

    本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走.下载源码,运行pip install -r requirements.txt 建立环境python db_ ...

随机推荐

  1. k8s yaml说明

    k8s yaml # yaml格式的pod定义文件完整内容: apiVersion: v1       #必选,版本号,例如v1 kind: Pod       #必选,Pod metadata:   ...

  2. CPU与GPU性能的比较报告

    运行时间分析 不同的模型在cpu和gpu下的时间差异较大,一般来说gpu会比cpu快5-20倍.我们选用了最常用的inception v3的分类模型,输入图片尺寸为:3x299x299. GPU 在一 ...

  3. Python 词典增加和删除

    增加 dict 里面的属性,必须先初始化 key,然后使用 append 添加值 #!/usr/bin/python3 message = dict() #message = { # "10 ...

  4. 链路追踪工具之Zipkin学习小记

    (接触了Zipkin,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...

  5. java 中 热部署与卸载关系

    今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了.前几天又有同事在讨论这个问题.这里拿来分享一下. 在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在 ...

  6. 使用100%面向过程的思维方式来写java程序

    1.java是强制写class关键字的语言,不能有独立的函数游离在类外出现在文件中,这和python c++ 都不同,后面的都可以单独在类外写函数,所以java被称为是纯面向对象的语言,py和c++都 ...

  7. ubuntu anaconda opencv问题

    在ubuntu16.04上使用opencv3时, 发现视频与imshow函数无法使用,经查资料发现 安装opencv时采用的简易的安装方法,没有编译opencv的源码. 因此会出现以上问题. 下载源码 ...

  8. 2018年总结&2019年计划

    今天加了来自博客园的好友,才意识到博客已经荒废了许久.其实自己最近也是考虑了总结一下这个繁忙的2018. 2019计划: . 多给家里通电话: . 关心照顾好小奶糖: . 多读书,非小说: . 坚持吃 ...

  9. PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

    CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件. 一.CSV数据导入函数fgetcsv() fgetcsv() 函数从文件指针中读入一行并解析 CSV ...

  10. Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.

    在使用Visual Studio进行项目开发的时候,有时候会遇到下面这个错误: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Ac ...