Python 能做些什么?
Python语言,众所周知,是一种比较容易上手的编程语言,Python常常被认为是科研人员用来做研究的最佳首选语言,如基本上所有的AI研究,最初的版本可能就是Python,后面才慢慢出现JavaScript的版本,及其他语言的版本,举个例子,langchain这个框架,使用它,几行代码,他就可以轻松让你连接各种大语言模型。
代码语言:javascript复制from langchain.schema import AIMessage, HumanMessage, SystemMessage
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
chat(
[
HumanMessage(
content="Translate this sentence from English to French: I love programming."
)
]
)
Python 实际上也可以很方便的做一个web服务
其实,Python出了作科学研究,近几年也有很多创业团队选择Python作为其技术栈,一个比较大众的说法是上手难度比较低,效率高,不但可以作为服务端语言,也可以用来开发web,这就对于创业公司来讲,是一个很有吸引力的点,因为创业团队资源少,前期就是需要做快速试错,快速验证商业模式是否可行。废话不多说,我们今天要讲的是基于python编程语言,手把手教你搭建Django web网站。
那么Python实现一个web网站,比较流行的框架其实是有多种的:
- Django:一个功能齐全的 Web 框架,提供了很多内置的功能,如 ORM、表单、身份验证等。适合开发大型的复杂项目。缺点是相对重量级,学习曲线较陡峭。
- Flask:一个轻量级的 Web 框架,易于上手,适合开发小型项目和微服务。Flask 采用了 “微核” 设计,核心功能有限,但可通过扩展实现更多功能。缺点是可能需要手动集成多个扩展,增加开发难度。
- FastAPI:一个现代的 Web 框架,基于 ASGI(Asynchronous Server Gateway Interface)设计,支持异步编程,性能优越。FastAPI 提供了自动 API 文档生成、输入验证等功能。适合开发 API 服务和实时 Web 应用。
以下是个框架的比较细致的对比图,如果你正在做技术选项,可以仔细参考参考。
特性 | Django | Flask | FastAPI |
---|---|---|---|
类型 | 全功能 Web 框架 | 轻量级 Web 框架 | 现代 Web 框架 |
适用项目 | 大型、复杂项目 | 小型项目、微服务 | API 服务、实时 Web 应用 |
设计模式 | Model-View-Template (MVT) | 微核设计 | 基于 ASGI 的异步编程 |
内置功能 | ORM、表单、身份验证等 | 有限,可通过扩展实现 | 自动 API 文档生成、输入验证 |
扩展性 | 丰富的插件生态系统 | 丰富的插件生态系统 | 丰富的插件生态系统 |
学习曲线 | 较陡峭 | 较为平缓 | 适中 |
性能 | 一般 | 良好 | 优越(支持异步编程) |
社区和文档 | 成熟、丰富的文档和社区支持 | 成熟、丰富的文档和社区支持 | 较新,但文档和社区支持迅速增长 |
我们今天是奔着做一个大型的web应用而来的,因此,直接选项 Django 这个老牌的框架,主要就是这个框架目前比较稳定,而且生态非常好,文档也是比较成熟的,遇到问题,汤坑也是比较容易的。
Django开发一个web应用的系统整体框架大概应该是这个样子,这是一个比较典型的MVC架构。
如果说使用Django实现一个 Hello World ,似乎缺那么点意思,所以我们选一个第二流行的 Todo list 应用吧。
Django 实现 Todo list 应用
为了保证可以按照我的步骤实现这个应用,请将Python环境设置为 3.10 版本。使用下面的命令来安装环境,打开django-admin
初始化的模板应用。
代码语言:shell复制pip3.10 install django
django-admin startproject todolist
cd todolist
python manage.py startapp todo
我们可以看到当我们执行了 django-admin startproject todolist ,将会生成一个如图所示的项目:
接下来我们去todo文件夹里面增加或者修改一些文件的内容,请按照以下内容创建或修改文件:
todo/models.py
代码语言:javascript复制python复制代码from django.db import models
class Todo(models.Model):
task = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
def __str__(self):
return self.task
todo/views.py
代码语言:javascript复制python复制代码from django.shortcuts import render, redirect
from .models import Todo
from .forms import TodoForm
def todo_list(request):
todos = Todo.objects.all()
form = TodoForm()
if request.method == 'POST':
form = TodoForm(request.POST)
if form.is_valid():
form.save()
return redirect('todo_list')
context = {'todos': todos, 'form': form}
return render(request, 'todo_list.html', context)
def update_todo(request, todo_id):
todo = Todo.objects.get(id=todo_id)
form = TodoForm(instance=todo)
if request.method == 'POST':
form = TodoForm(request.POST, instance=todo)
if form.is_valid():
form.save()
return redirect('todo_list')
context = {'form': form}
return render(request, 'update_todo.html', context)
def delete_todo(request, todo_id):
todo = Todo.objects.get(id=todo_id)
if request.method == 'POST':
todo.delete()
return redirect('todo_list')
context = {'todo': todo}
return render(request, 'delete_todo.html', context)
todo/urls.py
代码语言:javascript复制python复制代码from django.urls import path
from . import views
urlpatterns = [
path('', views.todo_list, name='todo_list'),
path('update/<int:todo_id>/', views.update_todo, name='update_todo'),
path('delete/<int:todo_id>/', views.delete_todo, name='delete_todo'),
]
todo/forms.py
代码语言:javascript复制python复制代码from django import forms
from .models import Todo
class TodoForm(forms.ModelForm):
class Meta:
model = Todo
fields = ['task', 'completed']
接下来,创建一个名为 templates
的文件夹,并在其中创建以下 HTML 模板文件:
todo_list.html
代码语言:javascript复制html复制代码<!DOCTYPE html>
<html>
<head>
<title>TODO List</title>
</head>
<body>
<h1>TODO List</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Add Task</button>
</form>
<ul>
{% for todo in todos %}
<li>
{{ todo.task }} - {{ todo.completed }}
<a href="{% url 'update_todo' todo.id %}">Update</a>
<a href="{% url 'delete_todo' todo.id %}">Delete</a>
</li>
{% endfor %}
</ul>
</body>
</html>
update_todo.html
代码语言:javascript复制html复制代码<!DOCTYPE html>
<html>
<head>
<title>Update Task</title>
</head>
<body>
<h1>Update Task</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Update Task</button>
</form>
</body>
</html>
delete_todo.html
代码语言:javascript复制html复制代码<!DOCTYPE html>
<html>
<head>
<title>Delete Task</title>
</head>
<body>
<h1>Delete Task</h1>
<p>Are you sure you want to delete "{{ todo.task }}"?</p>
<form method="POST">
{% csrf_token %}
<button type="submit">Yes, delete</button>
</form>
<a href="{% url 'todo_list' %}">Cancel</a>
</body>
</html>
最后,将 todo
应用添加到项目的 settings.py
文件中的 INSTALLED_APPS
列表中
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"todolist",
"todo"
]
然后,我们执行一下命令:
代码语言:javascript复制python3.10 manage.py makemigrations
成功之后,我们会看到项目文件夹下多了一个 sqlite 的数据库
接下来继续执行两个命令
代码语言:javascript复制python3.10 manage.py migrate
python3.10 manage.py runserver
打开http://127.0.0.1:8000/ ,就可以看到我们的web应用已经运行起来了,当然因为我们并没有添加样式,所以看起来还是比较基础的dom组织形态,但是我们可以验证一下逻辑,更新,删除任务都是ok的。
代码语言:javascript复制源码传送门: https://github.com/bravekingzhang/todo-django
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!