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

news/2024/5/20 4:35:38/文章来源:https://blog.csdn.net/weixin_34342992/article/details/92057367

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言

笔者之前未接触过 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 环境:

完成后点击 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 项目后,项目结构如下图所示:

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

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.py

import 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,如图:

接下来在 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,我们之后可以在命令行中直接使用。

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

运行

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

python manage.py runserver

命令行运行截图如下:

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

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

作者:KenChoi - 极光

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

知乎专栏:极光日报

转载于:https://my.oschina.net/jpushtech/blog/876073

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

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

相关文章

在RHEL、CentOS上安装建站神器Drupal 8

2019独角兽企业重金招聘Python工程师标准>>> Drupal 是一个开源&#xff0c;灵活&#xff0c;高度可拓展和安全的内容管理系统Content Management System(CMS)&#xff0c;使用户轻松的创建网站。 它可以使用模块拓展&#xff0c;使用户将内容管理转换为强大的数字解…

如何更有效使用Rational AppScan 扫描大型网站

Rational AppScan 工作原理 Rational AppScan&#xff08;简称 AppScan&#xff09;其实是一个产品家族&#xff0c;包括众多的应用安全扫描产品&#xff0c;从开发阶段的源代码扫描的 AppScan source edition&#xff0c;到针对 Web 应用进行快速扫描的 AppScan standard edit…

值得推荐的十大交互式可视化的网站

厌倦了静态图表&#xff0c;最近一直在看一些关于可以交互的数据可视化的案例&#xff0c;整理了一些有趣的交互式可视化的网站分享给大家。 01 Matt Daniels The Lasting Mark of Miles Davi 关于维基百科里提到“黑暗王子”迈尔斯戴维斯的页面次数统计&#xff0c;来证明这个…

云服务器 ECS 建站教程:Discuz安装教程

Discuz安装教程Discuz! 是全球成熟度最高、覆盖率最大的论坛软件系统之一。自 2001 年 6 月面世以来&#xff0c;Discuz! 已拥有 15 年以上的应用历史和 200 多万网站用户案例。目前&#xff0c;Discuz! 已经发展成为一个以社区为基础的专业建站平台&#xff0c;让论坛&#xf…

网站开发需要哪些技术_app开发需要哪些技术?4种app制作方法对比

开发一个完整的app需要哪些技术&#xff1f;App开发的到底要多少钱&#xff1f;如何简单快速低成本的开发app&#xff1f;现在&#xff0c;市场上的app开发可以分为4种不同的app开发方式&#xff0c;不同的app开发方式&#xff0c;对app技术、开发人员、开发成本、开发周期的要…

网站页面左右_网站优化都包括什么

SEO优化主要包括四个方向:内部结构优化&#xff0c;内容优化&#xff0c;内部链优化和外部链优化。 一&#xff0c;优化内部结构 1.TDK优化:此TDK不仅包括首页&#xff0c;还包括角页和文章页的TDK。因此&#xff0c;建议您在创建站点时自定义标签。T也就是title&#xff0c;网…

网站开发必备-快速浏览Asp.Net网站绿色小工具

< DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd> 选择此工具的理由&#xff1a;1.快速浏览Asp.Net网站 2.小巧 3.绿色 点击下载 前提&#xff0c;系统必须安装 .NET Framework 方法一. 将此程序放在网站根目录&#xff…

一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider...

考虑到实现注册用户后&#xff0c;自动具备访问网站的权限的文章共有近20幅截图&#xff0c;截图总大小近2M&#xff0c;为了尽量减少打开网页的时间&#xff0c;本篇文章将被分割成几个小的部分。因此而给大家带来的阅读不便&#xff0c;就请海涵了:)解决这个问题&#xff0c;…

网站服务器c盘在哪找,云服务器c盘在哪儿

云服务器c盘在哪儿 内容精选换一换根据磁盘ID&#xff0c;查询云服务器挂载的单个磁盘信息。GET /v2.1/{project_id}/servers/{server_id}/os-volume_attachments/{volume_id}参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。serve…

后台控制其他域名显示_SiteGround域名解析教程 | 如何将NameSilo 域名绑定到WordPress外贸网站...

我们在新购买的Siteground主机上成功安装Wordpress程序之后&#xff0c;下一步就是完成 Siteground 域名解析。你在浏览器中访问你的域名是无法正常打开网站的&#xff0c;这是因为&#xff0c;我们还没有把域名解析到Siteground的主机上。如下图&#xff0c;因为域名还未解析到…

搭建好域名服务器怎么设计网页,使用域名建站的几个步骤

相信大家都知道&#xff0c;建站第一步就是注册域名&#xff0c;然后购买主机服务器之类的&#xff0c;那么怎么使用域名去搭建网站呢?第一步&#xff1a;域名注册域名注册就是选一个合适自己的网址&#xff0c;域名非常重要&#xff0c;是我们迈出建站的第一步&#xff0c;也…

hive 的数据案例 统计网站的数据信息

根据hive的案例一增加需求一&#xff1a; 增加案例需求&#xff1a; 统计 pv , uv , 登录人数 , 游客人数 , 平均访问时长 , 二跳率 , 独立IP 用一张表去处理 1.1 查看track_log的分区 show partitions track_log ; 1.2 建立一张会话信息表&#xff08;session&#xff09;&am…

django搭建一个小型的服务器运维网站-最简单的实践之修改服务器时间

目录 项目介绍和源码&#xff1b; 拿来即用的bootstrap模板&#xff1b; 服务器SSH服务配置与python中paramiko的使用&#xff1b; 用户登陆与session;最简单的实践之修改服务器时间&#xff1b; 查看和修改服务器配置与数据库的路由&#xff1b; 基于websocket的实时日志实现&…

网站漏洞修复方案防止SQL注入攻击漏洞

SQL注入漏洞在网站漏洞里面属于高危漏洞&#xff0c;排列在前三&#xff0c;受影响范围较广&#xff0c;像asp、.net、PHP、java、等程序语言编写的代码&#xff0c;都存在着sql注入漏洞&#xff0c;那么如何检测网站存在sql注入漏洞&#xff1f; SQL注入漏洞测试方法 在程序代…

phpcms ajax加载列表,phpcms v9建站 ajax列表分页加载更多word文档教程

最新文章https: open weixin qq com 有这个的账号&#xff0c;给客户开通微信小程序不需要认证费直...https: open weixin qq com 有这个的账号&#xff0c;给客户开通微信小程序不需要认证费直...相关内容phpcms调用随机栏目 随机调用SQL语句&#xff0c;可以使用PHPCMS的get标…

谷歌运维新书《网站可靠性工作手册,SRE最佳实践》

为什么80%的码农都做不了架构师&#xff1f;>>> 最近谷歌发布了一本关于运维新书《The Site Reliability Workbook — Practical Ways to Implement SRE》&#xff08;网站可靠性工作手册&#xff0c;SRE最佳实践&#xff09;。这是继《Site Reliability Engineeri…

讲讲自己亲身经历网站备案的前前后后

终于是有了自己的个人备案&#xff0c;之前网站一直是挂在公司的服务器上&#xff0c;后来在阿里云买了一台虚拟主机&#xff0c;然后就把网站搬家了。其实在这次备案之前&#xff0c;我也只是对网站备案方面有个大概的了解&#xff0c;真正的还没有自己实际操作过&#xff0c;…

【转】高扩展性网站的50条原则

《高扩展性网站的50条原则》&#xff0c;利用一天半的时间快速浏览总结的电子书&#xff0c;对网站的建设有一个原则性的把握&#xff0c;书中提到的大部分原则现在已成为互联网行业的共识&#xff0c;但并不妨碍我们重新整理分类&#xff0c;从全局层面把控高扩展性网站的建设…

centos7云主机nginx+WordPress完整建站(博客)流程记录

一、安装nginx1、安装依赖#安装gccyum install gcc-c#安装 pcre-develyum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装OpenSSL yum install -y openssl openssl-devel2、安装nginx#创建nginx.repo文件vi /etc/yum.repos.d/nginx.repo #然后写…

centos7服务器网站不能登录,centos7无法联网_网站服务器运行维护

linux怎么启动docker服务_网站服务器运行维护linux启动docker服务的方法&#xff1a;1、使用sudo yum install 命令安装Docker。2、使用“sudo systemctl start docker”命令启动docker服务。1、修改配置文件使用 vi 编辑器修改 /etc/sysconfig/network-scripts/ifcfg-eth0进入…