从零开始用 Flask 搭建一个网站(一)

news/2024/4/28 15:57:11/文章来源:https://blog.csdn.net/weixin_33708432/article/details/89054543

前言

笔者之前未接触过 Python ,只是略懂一点前端,所以说从零开始也相差无几吧。Flask 是一个轻量级的基于 Python 的框架,但是扩展性非常良好( Github 上 22000 多个 star 就知道群众的选择不无道理),其他的这里就不多提了,下面就开始我们的网站搭建之路。

开始

环境搭建

首先需要准备 Python 开发环境,这里推荐使用 pyenv 来安装和管理 Python 。笔者使用的是 Mac OSX (自带 Python 2.6 ),直接使用如下命令安装 pyenv :

brew install pyenv

之后要升级 pyenv 的话就用:

brew upgrade pyenv

安装完以后,需要配置环境变量,如果使用 zsh ,需要在 ~/.zshrc 加入以下代码:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH=$PATH:/sbin/
eval "$(pyenv init -)"

如果使用 bash ,在 ~/.bash_profile 中加入即可。保存后重启终端即可。 如果要安装 Python 3.5.2 ,可以用

pyenv install 3.5.2

查看安装的 Python 版本:

pyenv versions

切换局部 Python 环境(这里一般指在 Application 文件夹下切换环境)

pyenv local 3.5.2

关于其他更多命令,可以参考 Command.md

使用 IDE

这里笔者推荐使用 PyCharm 来进行 python 项目开发。下载安装后(这里笔者下载的是 Professional 版本),新建一个 Flask 项目,然后指定目录、 python 环境:

clipboard.png

完成后点击 Create ,这样就创建了一个 Flask 项目,如果没有安装 Flask , PyCharm 会自动下载安装。如果想使用 virtualenv ,可以参考下一个步骤。

使用虚拟环境

使用虚拟环境可以方便地安装 Flask 而且可以在系统的 Python 解释器中避免包的混乱和版本的冲突。 Python 3.3 以后原生支持虚拟环境,命令为 pyvenv 。可以使用如下命令创建虚拟环境(进入刚才创建的 Flask 项目文件夹):

pyvenv venv

如果使用 Python 2.7 或者以下版本,可以使用第三方工具 virtualenv 创建虚拟环境:

sudo easy_install virtualenv

以上命令就可以安装 virtualenv (如果没有安装 easy_install ,需要手动安装,而 pyvenv 已经自带 pip 和 easy_install )。下一步使用 virtualenv 命令在文件夹中创建 Python 虚拟环境:

virtualenv venv

完成后,会在 Flask 项目下生成 venv 文件夹。在使用虚拟环境之前,要先使用( pyvenv 和 virtualenv 创建的虚拟环境是一样的,因此以下命令均可使用):

source venv/bin/activate

来激活,如果要退出虚拟环境,可以使用:

deactivate

创建的虚拟环境会自动安装 pip 和 easy_install ,接下来可以使用:

pip install flask

接下来就可以在 Flask 中开始自由地遨(入)游(坑)啦!

Flask 程序结构

在介绍 Flask 的程序结构之前,先来看看标准 Flask 项目的项目结构(笔者以为从宏观到微观的方式可以更快的了解一个东西)。使用 PyCharm 新建 Flask 项目后,项目结构如下图所示:

clipboard.png

只有三个文件夹( venv 文件夹已经用命令行生成了)和一个简单的入口类,接下来要把项目结构改造成标准的 Flask 项目结构:

clipboard.png

Flask 项目有 4 个顶级文件夹:

  • app ——(本例中是 jbox ) Flask 程序保存在此文件夹中

  • migrations ——包含数据库迁移脚本(安装了
    flask-migrate 后自动生成)

  • tests ——单元测试放在此文件夹下

  • venv —— Python 虚拟环境

同时还有一些文件:

  • requirements.txt —— 列出了所有的依赖包,以便于在其他电脑中重新生成相同的环境

  • config.py 存储配置

  • manage.py 启动程序或者其他任务

  • gun.conf Gunicorn 配置文件
    虽然新建的 Flask Project 已经可以运行,但是我们还是要按照标准的 Flask 程序来改造项目结构。下面我们就来改造一下 TestProject 。 在命令行中依次使用以下命令来安装 Flask 扩展:

pip install flask-script
pip install flask-sqlalchemy
pip install flask-migrate

flask-script 可以自定义命令行命令,用来启动程序或其它任务; flask-sqlalchemy 用来管理数据库的工具,支持多种数据库后台; flask-migrate 是数据库迁移工具,该工具命令集成到 flask-script 中,方便在命令行中进行操作。

然后创建 config.py 文件,内容如下:

  config.pyimport osbasedir = os.path.abspath(os.path.dirname(__file__))class config:    SECRET_KEY = os.environ.get('SECRET_KEY') or 'this is a secret string' SQLALCHEMY_TRACK_MODIFICATIONS = True  @staticmethod    def init_app(app):        passclass DevelopmentConfig(config):    DEBUG = True    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \        'sqlite:///' + os.path.join(basedir, 'dev')class TestingConfig(config):    TESTING = True    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \                              'sqlite:///' + os.path.join(basedir, 'test')class ProductionConfig(config):    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \                              'sqlite:///' + os.path.join(basedir, 'data.sqlite')config = {    'development': DevelopmentConfig,    'testing': TestingConfig,    'production': ProductionConfig,    'default': DevelopmentConfig
}

config 顾名思义,保存了一些配置变量。 SQLALCHEMY_DATABASE_URI 变量在不同的配置中被赋予了不同的值,这样就可以在不同的环境中切换数据库。如果是远程数据库则从环境变量中读取 URL ,否则在本地路径中创建。

接下来创建一个 app 文件夹,并在此文件夹中创建一个 __init__.py 文件( init 前后都有两个下划线):

app/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import configdb = SQLAlchemy()def create_app(config_name):    app = Flask(__name__)    app.config.from_object(config[config_name])    config[config_name].init_app(app)db.init_app(app)    //此处缺省了部分代码,后面会加上return app

create_app() 就是程序的工厂函数,参数就是配置类的名字,即 config.py ,其中保存的配置可以使用 from_object() 方法导入。

接下来要解释两个重要的概念——路由和视图函数。客户端把请求发给 Web 服务器, Web 服务器再把请求发给 Flask 程序实例, Flask 程序实例需要知道每个 URL 请求要运行哪些代码,所以保存了一个 URL 到 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由,这个函数称为视图函数。例如:

@app.route('/')
def index():return '<h1>Hello World</h1>'

这里使用 app.route 修饰器来定义路由, app 指 Flask 程序实例对象,后面可以看到使用蓝本管理路由后,由蓝本实例对象来取代 app 。 Flask 使用蓝本来定义路由,在蓝本中定义的路由处于休眠状态,直到蓝本注册到程序上后,路由真正成为程序的一部分。蓝本通常使用结构化的方式保存在包的多个模块中。接下来在 app 文件夹下创建一个子文件夹 main ,并在 main 中创建 __init__.py (如果使用 PyCharm ,这里有个快捷方式,右键点击 app 文件夹,在菜单中选择 new -> Python Package ,在弹出的对话框中填写包名然后确认即可):

app/main/__ init__.py

from flask import Blueprint
//实例化 Blueprint 类,两个参数分别为蓝本的名字和蓝本所在包或模块,第二个通常填 __name__ 即可
main = Blueprint('main', __name__)from . import views, errors

最后引用了两个文件,之所以写在最后是因为避免循环导入依赖,因为接下来在 main 文件夹下 创建的 views.py 和 errors.py 都要导入蓝本 main 。

app/main/views.py

from flask import render_template
//导入蓝本 main
from . import main@main.route('/')
def index():    return render_template('index.html')

在之前路由的概念解释中, index 函数直接返回了 HTML 字符串(通常不这么做),这里则使用了 render_templete() 函数来渲染 index.html ,并返回。 Flask 使用了 Jinja2 引擎来渲染模板,模板文件都放在 templates 文件夹下,并且只能命名为 templates ,否则 Jinja2 会抛出 TemplageNotFound 异常。由于我们的 app 是一个 Python Package (在目录中包含 init.py 默认成为 Python Package ),所以需要将 templates 放在 app 目录下。在 app 下 中创建名为 templates 的文件夹,在 PyCharm 中右键点击该文件夹,然后选择 Make Directory As -> Template Folder ,如图:

clipboard.png

接下来在 templates 下新建一个 index.html 和 404.html 模板:

app/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>    <meta charset="UTF-8">    <title>index</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>

app/templates/404.html

<!DOCTYPE html>
<html lang="en">
<head>    <meta charset="UTF-8">    <title>Not Found</title>
</head>
<body>
<h1>Can't find request page!</h1>
</body>
</html>

之后会讲解模板的具体用法,现在接着来定义 errors.py:

app/main/errors.py

from flask import render_template
from . import main@main.app_errorhandler(404)
def page_not_found(e):    return render_template('404.html'), 404    

上面的步骤是让程序的路由保存在 views.py 中,而错误处理交给 errors.py ,这两个模块已经和蓝本 main 关联起来了(在蓝本中导入了这两个模块),现在需要在工厂函数中注册蓝本 main 。将如下代码加入到上面缺省代码中即可:

app/__init__.py

def create_app(config_name):#...from .main import main as main_blueprintapp.register_blueprint(main_blueprint)return app

最后两个步骤是创建 requirements.txt 以及启动脚本 manage.py 。程序中必须包含一个 requirements.txt 文件,用于记录所有的依赖包和版本号,便于在其它电脑上创建相同的开发环境。直接在终端使用如下命令即可创建 requirements.txt 文件:

pip freeze > requirements.txt

以后安装了新的依赖包或者升级版本后,重新执行该命令即可更新 requirements.txt 文件。如果要手动添加也可以,在 PyCharm 中用 Command + , 唤出 Preferences 对话框,然后选择 Project -> Project Interpreter 即可查看所有的依赖包及其版本号(还有最新版本号提示),如图:

图片描述

如果要在另一台电脑上创建这个虚拟环境的完全副本,运行以下命令即可:

pip install -r requirements.txt

最后创建启动脚本 manage.py :

manage.py

import os
from app import create_app, db
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommandapp = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)def make_shell_context():    return dict(app=app, db=db)manager.add_command("shell",Shell(make_context=make_shell_context))manager.add_command('db', MigrateCommand)if __name__ == '__main__':    manager.run()

这个脚本首先创建程序,然后增加了两个命令: shell 和 db ,我们之后可以在命令行中直接使用。

到此为止,我们的目录结构如下:

clipboard.png

运行

现在就来启动我们的程序,在命令行中进入 TestProject 目录,然后执行如下命令即可运行:

python manage.py runserver
命令行运行截图如下:

clipboard.png

Flask 默认的本机地址为: http://127.0.0.1:5000/ ,现在用浏览器打开这个地址,应该可以看到如下页面:

clipboard.png

到这一步,我们的第一个 Flask 程序已经完成了!虽然还没有建立数据库,页面也非常糟糕,但是之后我们会一步步进行完善! 本文参考书籍 Flask Web 开发:基于 Python 的 Web 应用开发实战(作者: Miguel Grinberg)

作者: KenChoi - 极光( JPush 为极光团队账号,欢迎关注)

原文:从零开始用 Flask 搭建一个网站(一)

知乎专栏:极光日报

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_765847.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux服务器系统_网站服务器安全设置之Linux系统安全部署

针对于Linux系统的服务器安全设置常用的方法以及服务器的安全优化都进行详细的重点介绍给新手入门Linux系统的安全设置,安全无小事&#xff0c;作为一个专职的系统管理员&#xff0c;打造一个安全的linux系统是管理员的一个基本素质&#xff0c;以下15项讲的就是为客户部署的这…

js页面自适应屏幕大小_用 Axure 免费建个网站 (下):手机移动端自适应视图...

​Axure 自带自适应功能&#xff0c;可以自适应电脑、平板、手机等不同大小的屏幕&#xff0c;要完成手机屏幕的适配&#xff0c;需要做两个地方的设置&#xff0c;一个是页面自适应&#xff0c;一个是手机自适应。页面自适应那我们先聊页面自适应属性&#xff0c;页面自适应属…

web网站服务(二)

Web网站服务&#xff08;二&#xff09;一 客户机地址限制1&#xff09;Allow&#xff0c;deny 先允许后拒绝&#xff0c;默认拒绝所有末明确允许的客户机地址2&#xff09;deny&#xff0c;allow 先拒绝后允许&#xff0c;默认允许所有末明确拒绝客的户机地址地址形式可以是IP…

大型网站架构演化历程

2019独角兽企业重金招聘Python工程师标准>>> 大型网站的挑战主要来自庞大的用户&#xff0c;高并发的访问和海量数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得棘手。大型网站架构主要就是解决这类问题。更…

服务器系统版本更新,win10系统如何更新到1909版本_网站服务器运行维护,win10系统,更新,1909版本...

vi中哪条命令是不保存强制退出_网站服务器运行维护vi中“q!”命令是不保存强制退出。vi中的一些常用命令&#xff1a;“:w”保存、“:wq!”保存并强制退出、“:x”保存并退出(仅当文件有变化时保存)。注意问题&#xff1a;1、保证电源接通状态&#xff0c;笔记本要外接电源&…

windows 11家庭中文版 使用ie9及以下版本浏览器访问网站

说明&#xff1a; 最近维护一个网站&#xff0c;浏览器需要使用ie9及以下版本&#xff0c;找了很多方法&#xff0c;后来使用的还是ie11&#xff0c;只做了兼容性视图配置&#xff0c;就好了&#xff0c;挑了其中稍简便的方法&#xff0c;以供参考我使用的电脑操作系统版本 ![在…

网站性能测试基本指标

一&#xff0e;系统吞度量要素&#xff1a; 一个系统的吞度量&#xff08;承压能力&#xff09;与request对CPU的消耗、外部接口、IO等等紧密关联。 单个reqeust 对CPU消耗越高&#xff0c;外部系统接口、IO影响速度越慢&#xff0c;系统吞吐能力越低&#xff0c;反之越高。 系…

网站漏洞扫描工具Uniscan

2019独角兽企业重金招聘Python工程师标准>>> 网站漏洞扫描工具Uniscan 网站漏洞的种类有很多种&#xff0c;如何快速扫描寻找漏洞&#xff0c;是渗透测试人员面临的一个棘手问题。Uniscan是Kali Linux预先安装的一个网站漏洞扫描工具。该工具可以针对单一、批量、do…

h357.php,基于js的电商网站的搭建

课题研究的背景意义目前是一个互联网的时代&#xff0c;人们的需求日渐的被互联网满足&#xff0c;在这个大的背景下&#xff0c;我们想到了来搭建一个全面的电商的网站来满足的人们的日常的需求。这个前景还是很ok的。可行性研究技术可行性我们的目前学学了html&#xff0c;cs…

kentico7中设置网站的主页

打开SiteManager&#xff0c;选择Settings&#xff0c;然后左上角选择具体的网站&#xff0c;Content&#xff0c;Web Site Content&#xff0c;Default alias path

快速使用Let's Encrypt开启个人网站的https

背景 为什么要使用https? https可以有效避免无良运营商的DNS劫持&#xff0c;可以显著提升网站逼格。使用https已经是大势所趋&#xff0c;人心所向&#xff0c;iOS甚至强制要求开发者使用https。为什么要使用Lets Encrypt? 对于个人开发者而言&#xff0c;https证书太贵&…

搭建网站必不可少的知识8

如何选择主机操作系统&#xff1f;一、请根据网站使用的编程语言来选择合适的操作系统和主机类型&#xff1a;1、网站开发语言为ASP、.NET、HTML&#xff0c;请选择Windows系统虚拟主机免费版及其以上型号主机&#xff1b; 2、网站开发语言为PHP、HTML、WAP&#xff0c;请选择L…

可以免费下载视频素材和模板网站汇总

1.视崛&#xff1a;拥有比较丰富的AE模板和高清视频素材 传送门&#xff1a;http://www.shij001.com/ 2.92素材网&#xff1a;超清视频模板&#xff0c;可以用于商业用途 传送门&#xff1a;http://699pic.com/video/?sem1&sem_kid103309 3.新GG儿&#xff1a;数字视觉分享…

phpstudy2018搭建网站,访问目录出现Forbidden You don't have permission to access / on this server...

关于phpstudy2018搭建网站&#xff0c;访问目录出现Forbidden You dont have permission to access / on this server.&#xff1a; 我都配置好httpd.conf文件了 一开始还以为phpstudy2018出bug了呢&#xff0c;然后才发现还需要在phpstudy设置点东西 1. 首先httpd.conf配置文件…

大快网站:如何选择正确的hadoop版本

2019独角兽企业重金招聘Python工程师标准>>> 大快网站&#xff1a;如何选择正确的hadoop版本 Hadoop的环境安装部署是所有刚开始学习hadoop必然要面对的一个问题&#xff0c;对于新手而言基本不会一次性部署成功&#xff0c;甚至可能要花费好几天的时间才能完成hado…

访问网站的全过程解析(www.sangfor.com.cn)

以访问www.sangfor.com.cn为例&#xff0c;介绍网站访问的全过程 一般服务器都放到总部私网内&#xff0c;外网用户只能访问到公网地址。而且深信服官网服务器有两条线路&#xff0c;一条是电信的202.96.137.88另一条是网通的60.21.140.230 网站访问容易出现跨运营商访问&…

浅析:外链在SEO中的作用!

长期以来&#xff0c;外链在SEO工作都是一个不可逾越的话题&#xff0c;它在整站优化中&#xff0c;扮演重要的角色&#xff0c;特别是熊掌号上线&#xff0c;很多SEO人员&#xff0c;逐渐在唱衰外链的作用。而在实际工作&#xff0c;我们发现来自垂直行业具有一定权威度的外链…

SEO公司清法网络 分析seo优化排名下降的几大原因

企业网站在做SEO优化的过程中&#xff0c;总会遇到被“拔毛”的情况。而网站被“拔毛”后&#xff0c;权重降低&#xff0c;排名下降&#xff0c;让很多站长一筹莫展。搜索公关专家清法通过多年的SEO网站优化经验以及对网站排名问题的深入分析&#xff0c;总结出几个可能导致网…

使用Quasar设计Material和IOS风格的响应式网站

GITHUB&#xff1a;使用Quasar设计旅游网站文章链接&#xff1a;使用Quasar设计Material和IOS风格的响应式网站 Quasar Quasar是一款基于Vue.js开发的UI框架&#xff0c;可以让你轻松构建网站简洁明快的界面&#xff0c;更重要的是它还能让你轻松做好RWD&#xff08;响应式网站…

html 各大网站分享代码

通过这个网站可以制作 http://share.baidu.com/code <script>window._bd_share_config{"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"",…