<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web开发 &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/web%E5%BC%80%E5%8F%91/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Thu, 06 Nov 2025 11:36:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>Web开发 &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flask test_client()测试客户端为勾选框传递布尔值数据</title>
		<link>https://greyli.com/flask-test_client-pass-boolean-data/</link>
		<comments>https://greyli.com/flask-test_client-pass-boolean-data/#respond</comments>
		<pubDate>Sat, 28 Jul 2018 10:28:57 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[技术笔记]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[单元测试]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1820</guid>
		<description><![CDATA[今天写单元测试发现了一个常见的问题，即测试时发送POST请求时如何传入布尔值数据（勾选框字段值）？答案是：你没 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今天写单元测试发现了一个常见的问题，即测试时发送POST请求时如何传入布尔值数据（勾选框字段值）？答案是：你没法直接传递布尔值。其实这个答案相当显而易见，客户端当然没法向服务器端发送Python类型的数据，数据的转换是在接受到请求数据后在服务器端进行的。之前在不借助Flask-WTF/WTForms，手动编写表单并处理时就已经注意到了这个问题，不过在测试中不太容易想到。</p>
<p>首先，我们需要了解一下勾选框（<code>&lt;input type="checkbox"&gt;</code>）提交的行为：</p>
<ul>
<li>如果没有勾选，那么勾选框字段的值为空值，而且这个字段不会被序列化到请求中；在服务器端，WTForms会将其转换为<code>False</code>。</li>
<li>如果勾选框被勾选，那么传入服务器端的数据会是该字段value属性的值，如果value属性的值为空，那么则提交字符串<code>"on"</code>；在服务器端，WTForms会将其转换为<code>True</code>。</li>
</ul>
<p>也就是说，勾选框的数据只要不为空，WTForms就会将其转换为True。所以，在测试中，如果你想让勾选框的值最终转换为True，那么就传入任意字符串；反之则传递空字符串或直接不加入该字段。下面是传入空字符串的示例：</p>
<pre class="">def test_privacy_setting(self):
    self.login()
    response = self.client.post(url_for('user.privacy_setting'), data=dict(
        public_collections='',  # &lt;--
    ), follow_redirects=True)

    user = User.query.get(1)
    self.assertEqual(user.public_collections, False)</pre>
<p>顺便说一句，基于勾选框的提交行为，如果没有使用Flask-WTF/WTForms，那么在手动处理提交数据的时候也要进行相应的处理：没有在<code>request.form</code>中获取到勾选框字段（比如，<code>request.form.get('remember')</code>会是<code>None</code>），即表示没有勾选，那么就转换为False；勾选框字段一旦出现，那么就表示勾选，转换为<code>True</code>。</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/flask-test_client-pass-boolean-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pipenv：新一代Python项目依赖管理工具</title>
		<link>https://greyli.com/pipenv-new-python-dependency-management-tool/</link>
		<comments>https://greyli.com/pipenv-new-python-dependency-management-tool/#respond</comments>
		<pubDate>Fri, 08 Jun 2018 00:04:04 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[开发工具]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1458</guid>
		<description><![CDATA[UPDATE（2019/8/31）：不要用 Pipenv 什么是Pipenv Pipenv是Kenneth R [&#8230;]]]></description>
				<content:encoded><![CDATA[<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="1hl8p-0-0">UPDATE（2019/8/31）：<a href="http://greyli.com/do-not-use-pipenv/">不要用 Pipenv</a></div>
<div data-block="true" data-editor="cgc3u" data-offset-key="1hl8p-0-0">
<hr /></div>
<h2 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="e60ge-0-0"><span data-offset-key="e60ge-0-0"><span data-text="true">什么是Pipenv</span></span></h2>
<div data-block="true" data-editor="cgc3u" data-offset-key="5ckd0-0-0">
<div data-offset-key="5ckd0-0-0"><a href="https://docs.pipenv.org/" target="_blank" rel="noopener" data-offset-key="5ckd0-0-0" data-editable="true"><span data-offset-key="5ckd0-0-0"><span data-text="true">Pipenv</span></span></a><span data-offset-key="5ckd0-1-0"><span data-text="true">是Kenneth Reitz在2017年1月发布的Python依赖管理工具，现在由PyPA维护。你可以把它看做是pip和virtualenv的组合体，而它基于的</span></span><a href="https://github.com/pypa/pipfile" target="_blank" rel="noopener" data-offset-key="5ckd0-2-0" data-editable="true"><span data-offset-key="5ckd0-2-0"><span data-text="true">Pipfile</span></span></a><span data-offset-key="5ckd0-3-0"><span data-text="true">则用来替代旧的依赖记录方式（requirements.txt）。</span></span></div>
<div data-offset-key="5ckd0-0-0"> </div>
</div>
<div data-block="true" data-editor="cgc3u" data-offset-key="f6usd-0-0">
<div data-offset-key="f6usd-0-0"><span data-offset-key="f6usd-0-0"><span data-text="true">在这篇文章里，我将会以旧的依赖管理工作流程作为对比来介绍Pipenv的基本用法，更详细的用法可以参考</span></span><a href="https://docs.pipenv.org/" target="_blank" rel="noopener" data-offset-key="f6usd-1-0" data-editable="true"><span data-offset-key="f6usd-1-0"><span data-text="true">Pipenv文档</span></span></a><span data-offset-key="f6usd-2-0"><span data-text="true">，或是Kenneth Reitz在PyCon 2018的演讲</span></span><a href="https://www.youtube.com/watch?v=GBQAKldqgZs" target="_blank" rel="noopener" data-offset-key="f6usd-3-0" data-editable="true"><span data-offset-key="f6usd-3-0"><span data-text="true">《Pipenv: The Future of Python Dependency Management》</span></span></a><span data-offset-key="f6usd-4-0"><span data-text="true">。</span></span></div>
</div>
<div data-block="true" data-editor="cgc3u" data-offset-key="bdmuv-0-0">
<div data-offset-key="bdmuv-0-0"> </div>
<div data-offset-key="bdmuv-0-0"><span data-offset-key="bdmuv-0-0"><span data-text="true">顺便说一句，我的</span></span><a href="https://zhuanlan.zhihu.com/p/25214275" target="_blank" rel="noopener" data-offset-key="bdmuv-1-0" data-editable="true"><span data-offset-key="bdmuv-1-0"><span data-text="true">还没想好名字的Flask书</span></span></a><span data-offset-key="bdmuv-2-0"><span data-text="true">中所有示例程序都使用了Pipenv进行依赖管理。</span></span></div>
</div>
<blockquote class="Editable-styled" data-block="true" data-editor="cgc3u" data-offset-key="aac4u-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="aac4u-0-0"><span data-offset-key="aac4u-0-0"><span data-text="true">提示 如果你对virtualenv的用法以及虚拟环境的概念不熟悉的话，可以通过专栏的旧文</span></span><a class="Link ztext-link" href="https://zhuanlan.zhihu.com/p/23299058" target="_blank" rel="noopener" data-offset-key="aac4u-1-0" data-editable="true"><span data-offset-key="aac4u-1-0"><span data-text="true">《Flask出发之旅》</span></span></a><span data-offset-key="aac4u-2-0"><span data-text="true">进行简单的认识。</span></span></div>
</blockquote>
<h2 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dh1n3-0-0"><span data-offset-key="dh1n3-0-0"><span data-text="true">为什么使用Pipenv</span></span></h2>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="2ksn7-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="2ksn7-0-0"><span data-offset-key="2ksn7-0-0"><span data-text="true">Pipenv会自动帮你管理虚拟环境和依赖文件，并且提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作。简而言之，它更方便、完善和安全。你可以通过</span></span><a class="Link ztext-link" href="https://docs.pipenv.org/" target="_blank" rel="noopener" data-offset-key="2ksn7-1-0" data-editable="true"><span data-offset-key="2ksn7-1-0"><span data-text="true">Pipenv文档</span></span></a><span data-offset-key="2ksn7-2-0"><span data-text="true">开头的介绍来了解它的详细特性。Pipenv的slogan是“Python Dev Workflow for Humans”，作为人类，当然应该尝试一下……</span></span></div>
</div>
<h2 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="chlha-0-0"><span data-offset-key="chlha-0-0"><span data-text="true">如何使用Pipenv</span></span></h2>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="6drib-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6drib-0-0"><span data-offset-key="6drib-0-0"><span data-text="true">假设我们要编写一个博客程序，项目的依赖是Flask和Flask-WTF。顺便说一句，可以使用下面的命令安装Pipenv：</span></span></div>
</div>
<pre data-offset-key="5nr5g-0-0" class="">$ pip install pipenv</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="c8sfs-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c8sfs-0-0"><span data-offset-key="c8sfs-0-0"><span data-text="true">下面我会通过不同操作来给出所需命令的对比，OLD（旧）表示使用pip和virtualenv，NEW（新）表示使用Pipenv。</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="e53kk-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="e53kk-0-0"><span data-offset-key="e53kk-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="26tfb-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="26tfb-0-0"><span data-offset-key="26tfb-0-0"><span data-text="true">创建虚拟环境</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="aa6sv-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="aa6sv-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="aa6sv-0-0"><span data-offset-key="aa6sv-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ar2de-0-0">$ virtualenv venv </pre>
<blockquote class="Editable-styled" data-block="true" data-editor="cgc3u" data-offset-key="dlrb2-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dlrb2-0-0"><span data-offset-key="dlrb2-0-0"><span data-text="true"> 提示 这里的venv是虚拟环境目录的名称，你可以自由更改，这会在你的项目根目录创建一个venv文件夹，其中包含独立的Python解释器环境。</span></span></div>
</blockquote>
<ul class="public-DraftStyleDefault-ul" data-offset-key="c3js6-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="c3js6-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c3js6-0-0"><span data-offset-key="c3js6-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dnilj-0-0">$ pipenv install</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="8ep6c-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8ep6c-0-0"><span data-offset-key="8ep6c-0-0"><span data-text="true">Pipenv会自动为你创建虚拟环境，自动生成一个随机的虚拟环境目录名。</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="c08t1-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c08t1-0-0"><span data-offset-key="c08t1-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="nibv-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="nibv-0-0"><span data-offset-key="nibv-0-0"><span data-text="true">激活虚拟环境</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="d9f2c-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="d9f2c-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d9f2c-0-0"><span data-offset-key="d9f2c-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="7tn19-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7tn19-0-0"><span data-offset-key="7tn19-0-0"><span data-text="true">在Linux或macOS系统中：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7i86i-0-0">$ . venv/bin/activate</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="7gsee-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7gsee-0-0"><span data-offset-key="7gsee-0-0"><span data-text="true">Windows：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7s21r-0-0">&gt; venv\Scripts\activate</pre>
<ul class="public-DraftStyleDefault-ul" data-offset-key="5i7lv-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="5i7lv-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5i7lv-0-0"><span data-offset-key="5i7lv-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7kkq3-0-0">$ pipenv shell</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="f93q6-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f93q6-0-0"><span data-offset-key="f93q6-0-0"><span data-text="true">此外，Pipenv还提供了一个pipenv run命令，在该命令后附加的参数会直接作为命令在虚拟环境中执行，这允许你不必显式的激活虚拟环境即可在虚拟环境中执行命令。比如，pipenv run python会启动虚拟环境中的Python解释器。</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="c68a1-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c68a1-0-0"><span data-offset-key="c68a1-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="flvlc-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="flvlc-0-0"><span data-offset-key="flvlc-0-0"><span data-text="true">安装依赖到虚拟环境</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="f28q-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="f28q-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="f28q-0-0"><span data-offset-key="f28q-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7eobq-0-0">$ . venv/bin/activate # 需要先激活虚拟环境
(venv)$ pip install flask flask-wtf </pre>
<ul class="public-DraftStyleDefault-ul" data-offset-key="5eti4-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="5eti4-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5eti4-0-0"><span data-offset-key="5eti4-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="d3u4j-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d3u4j-0-0"><span data-offset-key="d3u4j-0-0"><span data-text="true">使用Pipenv，不管你是否激活了虚拟环境，都可以通过pipenv install命令安装：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8h2fv-0-0">$ pipenv install flask flask-wtf </pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="b3a0r-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="b3a0r-0-0"><span data-offset-key="b3a0r-0-0"><span data-text="true">事实上，对一个新项目来说，你不必手动使用pipenv install来创建虚拟环境。当使用pipenv install xxx直接安装依赖包时，如果当前目录不包含虚拟环境，Pipenv会自动创建一个。</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="fb371-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="fb371-0-0"><span data-offset-key="fb371-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="4n68a-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4n68a-0-0"><span data-offset-key="4n68a-0-0"><span data-text="true">记录依赖</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="pgo7-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="pgo7-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="pgo7-0-0"><span data-offset-key="pgo7-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="5t1ak-0-0">(venv)$ pip freeze &gt; requirements.txt</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="394po-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="394po-0-0"><span data-offset-key="394po-0-0"><span data-text="true">这个命令会把依赖列表写入requirements.txt文件。每当你安装或卸载了依赖包时，都需要手动更新这个文件。你必须保持谨慎，否则非常容易把依赖列表弄乱。</span></span></div>
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="394po-0-0"> </div>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="1ikpa-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="1ikpa-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="1ikpa-0-0"><span data-offset-key="1ikpa-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="d2828-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d2828-0-0"><span data-offset-key="d2828-0-0"><span data-text="true">使用Pipenv时，什么都不必做，Pipenv会自动帮你管理依赖。Pipenv会在你创建虚拟环境时自动创建Pipfile和Pipfile.lock文件（如果不存在），并且会在你使用pipenv install和pipenv uninstall命令安装和卸载包时自动更新Pipfile和Pipfile.lock。</span></span></div>
</div>
<blockquote class="Editable-styled" data-block="true" data-editor="cgc3u" data-offset-key="ffrlo-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ffrlo-0-0"><span data-offset-key="ffrlo-0-0"><span data-text="true">附注 Pipfile用来记录项目依赖包列表，而Pipfile.lock记录了固定版本的详细依赖包列表。</span></span></div>
</blockquote>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="a99k7-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a99k7-0-0"><span data-offset-key="a99k7-0-0"><span data-text="true">在部署环境安装依赖</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="114v7-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="114v7-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="114v7-0-0"><span data-offset-key="114v7-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="77nip-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="77nip-0-0"><span data-offset-key="77nip-0-0"><span data-text="true">当我们需要在一个新的环境，比如部署上线环境安装所有依赖时，我们需要重复上面的多条命令：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="oe1p-0-0">$ virtualenv venv # 创建虚拟环境
$ . venv/bin/activate # 激活虚拟环境
(venv)$ pip install -r requirements.txt # 安装requirement.txt中记录的依赖</pre>
<ul class="public-DraftStyleDefault-ul" data-offset-key="dsd2t-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="dsd2t-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="dsd2t-0-0"><span data-offset-key="dsd2t-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="7sl7d-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7sl7d-0-0"><span data-offset-key="7sl7d-0-0"><span data-text="true">使用Pipenv则只需要执行pipenv install，它会自动安装Pipfile中记录的依赖：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="ce9il-0-0">$ pipenv install</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="b73q8-0-0">
<h3 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="b73q8-0-0"><span data-offset-key="b73q8-0-0"><span data-text="true">区分开发依赖</span></span></h3>
</div>
<ul class="public-DraftStyleDefault-ul" data-offset-key="6kg82-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="6kg82-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="6kg82-0-0"><span data-offset-key="6kg82-0-0"><span data-text="true">OLD</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="92qd2-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="92qd2-0-0"><span data-offset-key="92qd2-0-0"><span data-text="true">使用requirements.txt时，我们通过会单独创建一个requirements-dev.txt文件来手动加入开发依赖。比如项目开发时才会用到pytest，那么你需要手动创建这个文件，然后写入：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9sauk-0-0">-r requirements.txt
pytest==1.2.3</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="21bkc-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="21bkc-0-0"><span data-offset-key="21bkc-0-0"><span data-text="true">在新的开发环境安装依赖时，你需要安装这个文件中的依赖：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4c0dv-0-0">(venv)$ pip install -r requirements-dev.txt</pre>
<ul class="public-DraftStyleDefault-ul" data-offset-key="a55bc-0-0">
<li class="Editable-styled public-DraftStyleDefault-unorderedListItem public-DraftStyleDefault-reset public-DraftStyleDefault-depth0 public-DraftStyleDefault-listLTR" data-block="true" data-editor="cgc3u" data-offset-key="a55bc-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="a55bc-0-0"><span data-offset-key="a55bc-0-0"><span data-text="true">NEW</span></span></div>
</li>
</ul>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="btjre-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="btjre-0-0"><span data-offset-key="btjre-0-0"><span data-text="true">使用Pipenv时，你只需要在安装pytest时添加一个&#8211;dev选项，它会自动被分类为开发依赖（写入Pipfile的dev-packages一节中）：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="4bf2p-0-0">$ pipenv install pytest --dev</pre>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="fgrbm-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="fgrbm-0-0"><span data-offset-key="fgrbm-0-0"><span data-text="true">在新的开发环境安装依赖时，也只需要在pipenv install命令后添加&#8211;dev选项即可一并安装开发依赖：</span></span></div>
</div>
<pre class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="d251j-0-0">$ pipenv install --dev</pre>
<h2 class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="8saoi-0-0"><span data-offset-key="8saoi-0-0"><span data-text="true">总结</span></span></h2>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="7os3t-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="7os3t-0-0"><span data-offset-key="7os3t-0-0"><span data-text="true">为了让你更轻松的过渡，Pipenv甚至提供了读取和生成requirements.txt文件的功能（在使用pipenv install命令时它会自动读取requirements.txt文件安装依赖并生成Pipfile文件）。希望这篇文章可以让你更快的上手Pipenv。</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="c5n0g-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="c5n0g-0-0"><span data-offset-key="c5n0g-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="cb753-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="cb753-0-0"><span data-offset-key="cb753-0-0"><span data-text="true">&#8211; &#8211; &#8211; &#8211; &#8211;</span></span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="17rhl-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="17rhl-0-0"><a class="Link ztext-link" href="https://zhuanlan.zhihu.com/flask" target="_blank" rel="noopener" data-offset-key="17rhl-0-0" data-editable="true"><span data-offset-key="17rhl-0-0"><span data-text="true">知乎专栏 Hello, Flask!</span></span></a></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="cd1p3-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="cd1p3-0-0"><span data-offset-key="cd1p3-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="9egpt-0-0">
<div class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr" data-offset-key="9egpt-0-0"><span data-offset-key="9egpt-0-0"> </span></div>
</div>
<div class="Editable-unstyled" data-block="true" data-editor="cgc3u" data-offset-key="enpff-0-0"> </div>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/pipenv-new-python-dependency-management-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
