30天学习Python👨💻第二十四天——Web开发基础
介绍
今天我探索了怎么使用Python开发网站。web开发主要可以分为两大类——客户端(前端)和服务端(后端)。无论何时我们在浏览器输入任意网站的URL,浏览器都会向这个服务器发送一个请求,服务器接收这个请求并且返回这个网站的内容(HTML,CSS,JS,图片等),然后浏览器进行渲染并展示网页。使用Python,我们可以创建一个服务,它能够确认向它发出的请求,并向请求者提供适当的内容。服务可以用任意语言来写,比如Ruby,JavaScript,Java等。但是使用我们已有的Python知识,我们可以很容易的构建出一个成熟的网站。
Python有一个内置的http.server模块docs.python.org/3/library/h…
在Python中有很多web框架,提供了web应用开发所需要的一组全面特性。一些流行的框架如下:
- Django - 可能是最有名的框架,提供了所需要的最广泛的特性。更多的介绍可以看它的文档docs.djangoproject.com/en/3.0/
- Flask - 被列入微型框架。它比较简小,但是扩展性很强,并且提供了大量构建web应用所需要的功能。
- Pyramid 是另一个Python轻量级的web框架。
使用Flask创建Web应用
Flask是一个很容易上手的框架,所以我选择使用它构建我们的第一个web应用。它的文档也非常简单易懂,提供了我们构建项目所需要的全部信息。
我决定开发一个简单的博客应用。在今天的这篇文章中,我们只做一些基本的设置,剩下的开发留到明天。
我将这个项目命名为python-blog。下一步是在项目中创建一个虚拟环境。Python 3有一个内置的venv命令来创建虚拟环境。
$ python -m venv venv
这将会在项目中创建一个包含所有虚拟环境文件的venv文件夹。下一步是激活虚拟环境。
$ . venv/Scripts/activate
使用的终端不同,命令也会所有不同。docs.python.org/3/tutorial/… 这篇文章是关于虚拟环境的详细指南。在激活虚拟环境之后,flask库就可以下载了。这次将只会在项目的虚拟环境中下载包。
$ pip install flask
现在我们可以构建一个简单的服务来测试flask。我创建一个Python文件server.py来写我们的服务端代码。
server.py
# 从flask包中导入Flask类
from flask import Flask
# 通过提供应用程序模块作为参数来创建Flask类的实例
app = Flask(__name__)
@app.route('/')
def my_first_app():
return 'This is my first Python Web Application!'
Flask使用装饰器函数为这个应用处理不同的路由。在这里,我们处理了应用的默认根路由。
Flask提供了一些环境变量。为了运行应用,这个FLASK_APP环境变量需要指定服务器文件,这里是server.py。然后使用flask run运行应用。
$ export FLASK_APP=hello.py
$ flask run
* Running on http://127.0.0.1:5000/
打开本地URLhttp://127.0.0.1:5000,我们应该可以看到应用的内容。
为了确保能够监听得到代码的变化,Flask的debug模式需要像这样开启
$ export FLASK_ENV=development
$ flask run
现在server.py文件任何的修改之后服务都不需要重启。
使用Flask服务文件
为了构建实际的网站启动,我们需要一些提供一些文件,比如HTML,CSS,可能还有一些JS。Flask对于提供文件有一些惯例。
所有的模板文件(HTML)需要放在一个模板文件夹中,并且所有的静态文件(CSS,JS,其他资源)需要放倒一个静态资源文件夹中。Flak内部使用Jinjajinja.palletsprojects.com/en/2.11.x/模…
我创建了两个模板文件,index.html,about.html和一个CSS文件styles.css管理全局样式。为了提供模板文件,Flask提供了一个函数render_template。
server.py
# 从flask包中引入Flask类
from flask import Flask, render_template
# 通过传入应用模块作为参数来创建Flask类的实例
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/about')
def about():
return render_template('about.html')
我们可以像URL传入动态的参数,像这样,然后使用变量规则动态的在模板中渲染它们。因为我们要构建一个简单的博客,让我们创建一个post路由,它可以接受一个post_id作为参数,动态渲染出不同的内容。也可以将一个转换器类型作为<converter:variable>传递给变量。以下是可用的转换器类型的类型
| string | (default) accepts any text without a slash | | int | accepts positive integers | | float | accepts positive floating-point values | | path | like string but also accepts slashes | | uuid | accepts UUID strings |
server.py
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 显示带有给定id的页面,id是一个整数
return 'Post %d' % post_id
现在在URL/post后输入任意的数字,都应该动态的显示输入的post_id。因为我们添加了一个int转化器,传入任意除了数字之外的值,会出现页面找不到的结果。
参考
我只是非常简短的提及了Python中Web开发最基础的部分。下面是一些非常好的深入探索web开发的文章。
- djangostars.com/blog/python…
- developer.mozilla.org/en-US/docs/…
- developer.mozilla.org/en-US/docs/…
- www.fullstackpython.com/web-develop…
- www.digitalocean.com/community/t…
项目的代码在这个仓库中可以找到github.com/arindamdawn…
这就是今天的全部了。明天,我将继续为博客添加更多的功能,同时探索Flask更多的概念。我已经使用Flask创建了一个web应用。你可以参考文档来探索Django,也可以尝试用它构建简单的应用程序。