分类目录归档:计算机与编程

为Git仓库里的.idea文件夹正名

在网络上,我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志愿者提交的项目的点评,其中在“项目规范”中有一条加分项为“没有 .idea 这种不该上传的文件夹”;另一次是在知乎评价某程序员的问题下某个回答的评论中,有人发现该程序员的GitHub仓库里有.idea目录,就居高临下的将其作为理由讽刺该程序员,潜台词即“项目里有.idea = 水平低下”。想当然的,我没看到的类似情况会更多,而这些观点又会影响很多不熟悉具体事实的人,我想我应该尽一份力来改变这个错误的观点继续蔓延。

Pipenv:新一代Python项目依赖管理工具

 

什么是Pipenv

Pipenv是Kenneth Reitz在2017年1月发布的Python依赖管理工具,现在由PyPA维护。你可以把它看做是pip和virtualenv的组合体,而它基于的Pipfile则用来替代旧的依赖记录方式(requirements.txt)。 在这篇文章里,我将会以旧的依赖管理工作流程作为对比来介绍Pipenv的基本用法,更详细的用法可以参考Pipenv文档,或是Kenneth Reitz在PyCon 2018的演讲《Pipenv: The Future of Python Dependency Management》 顺便说一句,我的还没想好名字的Flask书中所有示例程序都使用了Pipenv进行依赖管理。
提示 如果你对virtualenv的用法以及虚拟环境的概念不熟悉的话,可以通过专栏的旧文《Flask出发之旅》进行简单的认识。

为什么使用Pipenv

Pipenv会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作。简而言之,它更方便、完善和安全。你可以通过Pipenv文档开头的介绍来了解它的详细特性。Pipenv的slogan是“Python Dev Workflow for Humans”,作为人类,当然应该尝试一下……

如何使用Pipenv

假设我们要编写一个博客程序,项目的依赖是Flask和Flask-WTF。顺便说一句,可以使用下面的命令安装Pipenv: 下面我会通过不同操作来给出所需命令的对比,OLD(旧)表示使用pip和virtualenv,NEW(新)表示使用Pipenv。  

创建虚拟环境

  • OLD
提示 这里的venv是虚拟环境目录的名称,你可以自由更改,这会在你的项目根目录创建一个venv文件夹,其中包含独立的Python解释器环境。
  • NEW
Pipenv会自动为你创建虚拟环境,自动生成一个随机的虚拟环境目录名。  

激活虚拟环境

  • OLD
在Linux或macOS系统中: Windows:
  • NEW
此外,Pipenv还提供了一个pipenv run命令,在该命令后附加的参数会直接作为命令在虚拟环境中执行,这允许你不必显式的激活虚拟环境即可在虚拟环境中执行命令。比如,pipenv run python会启动虚拟环境中的Python解释器。  

安装依赖到虚拟环境

  • OLD
  • NEW
使用Pipenv,不管你是否激活了虚拟环境,都可以通过pipenv install命令安装: 事实上,对一个新项目来说,你不必手动使用pipenv install来创建虚拟环境。当使用pipenv install xxx直接安装依赖包时,如果当前目录不包含虚拟环境,Pipenv会自动创建一个。  

记录依赖

新发布的Flask1.0带来了哪些新变化?

就在五个小时前,Flask终于发布了8年来的第一个主版本——1.0,这个版本带来了很多新的变化,让我们拥抱变化吧,请使用下面的命令来更新:

主要的变化

  • 从0.11开始,Flask引入了命令行支持,建议使用flask run命令来取代app.run()方法。1.0版本支持将Flask_APP环境变量设为包名称。Flask会自动在app.pywsgi.py寻找名称为appapplication的程序实例,同时会在传入的模块或包中寻找名称为create_app()make_app()的0参数的工厂函数。
  • 新添加了一个FLASK_ENV环境变量来设置Flask运行的环境,默认为production。在开发时需要设为development,这会自动开启调试器和重载器(即调试模式),避免直接使用FLASK_DEBUG
  • 当安装了python-dotenv时,flask命令(比如flask runflask shell等)会自动从项目根目录下的.flaskenv.env文件中导入环境变量,这样可以避免每次都手动设置环境变量。前者用来存储公开的Flask相关的环境变量,比如FLASK_APPFLASK_ENV等,后者用来存储包含敏感信息的环境变量,比如邮箱密码,API密钥等等,需要将文件名添加到.gitignore中。
  • 开发服务器默认开启多线程支持。
  • 日志系统被极大的简化,日志器总是命名为flask.app,它只会在没有日志处理器注册的情况下才添加处理器,而且不会移除已经存在的处理器。
  • 测试客户端(test_client)支持使用json参数来传入JSON数据,你可以使用这个特性来测试Web API。返回的响应对象添加了get_json方法来获取JSON数据。
  • 添加了一个 test_cli_runner() 方法,它可以用来触发使用Click注册的flask命令,我们可以使用它来测试自定义的flask命令。
  • 添加了一个flask routes命令,用来输出程序所有注册的路由。
  • 移除了旧的扩展导入代码flask.ext,还在使用旧的导入方式的扩展将无法使用。
  • 带来了一个重写后的Flaskr教程,包含了大量重构和改进,其他部分的文档也包含大量更新。
  • 和大多数项目一样,1.0版本不再支持Python2.6和3.3。

你可以访问Flask Changelog – Flask 1.0 documentation查看完整的Changelog,并了解每一个变化所对应的PR或Issue。

Flask-CKEditor——为Flask项目集成富文本编辑器

CKEditor是一个富文本编辑器,也就是WYSIWYG编辑器(所见即所得编辑器)。为了简化将CKEditor集成到Flask项目中的过程,就有了Flask-CKEditor。

Flask-CKEditor提供了一个CKEditorField,和你平时从WTForms导入的StringField、SubmitField用法相同。事实上,它就是对WTForms提供的TextAreaField进行了包装。初次之外,它还包含下面这些特性:

我的第一个Chrome扩展:GhostPage(网页X光)

没有接触过Chrome扩展的时候,觉得它一定很复杂。crx的后缀也让我猜不出是用什么语言编写的,现在才发现不过就是HTML+CSS+JavaScript……

这个扩展本身很简单,实际只有一行代码。Google提供了一个非常好的入门指导,过一遍基本上就可以编写简单的扩展了。这个扩展作用也就是通过去掉页面样式来检查页面结构(参考这篇文章),可以用来解决下面的问题:

Flask-Dropzone:为你的项目添加文件上传功能

某天在Stack Overflow上看到一个关于Dropzone.js的问题,就去研究了一下,写了一个回答,顺便写了一个小demo。我发现,如果有一个集成Dropzone.js到Flask,并且简化设置步骤的扩展,肯定要比其他上传方式简单的多——于是就有了Flask-Dropzone