基于python,手把手教你搭建Django web网站

2023-11-14 20:29:11 浏览数 (3)

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网站,比较流行的框架其实是有多种的:

  1. Django:一个功能齐全的 Web 框架,提供了很多内置的功能,如 ORM、表单、身份验证等。适合开发大型的复杂项目。缺点是相对重量级,学习曲线较陡峭。
  2. Flask:一个轻量级的 Web 框架,易于上手,适合开发小型项目和微服务。Flask 采用了 “微核” 设计,核心功能有限,但可通过扩展实现更多功能。缺点是可能需要手动集成多个扩展,增加开发难度。
  3. 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 列表中

代码语言:javascript复制
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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞