2024-09-04

在Django项目中,我们通常会创建多个应用(app)来封装特定的功能,比如用户管理、产品管理等。在Django项目中创建应用的命令是:

python manage.py startapp myapp
Bash

这里的myapp是应用的名称,你可以根据需要命名。

应用目录结构:

  • migrations/: 用于存放数据库迁移文件的目录。
  • admin.py: 用于注册模型类到Django自带的admin后台。
  • apps.py: 应用的配置类文件。
  • models.py: 用于定义数据库模型的地方。
  • tests.py: 用于写测试案例的地方。
  • views.py: 用于写视图的地方,比如处理HTTP请求。
  • urls.py: 用于定义应用的URL模式。

models.py中定义模型类:

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
Python

views.py中编写视图函数:

from django.http import HttpResponse

def my_view(request):
    return HttpResponse("Hello, World!")
Python

在项目的urls.py中引用视图并定义URL:

from django.urls import path
from myapp.views import my_view

urlpatterns = [
    path('hello/', my_view, name='my_view'),
]
Python

以上是创建应用和简单的模型定义、视图编写和URL配置的例子。在实际开发中,每个应用会根据自己的功能有更复杂的代码组织和交互。

2024-09-04

创建第一个Django项目的步骤如下:

  1. 安装Django:

    在命令行中运行 pip install django 来安装Django。

  2. 创建项目:

    运行 django-admin startproject myproject 来创建一个名为 myproject 的新项目。

  3. 进入项目目录:

    使用 cd myproject 进入创建的项目目录。

  4. 运行开发服务器:

    运行 python manage.py runserver 来启动开发服务器,默认监听8000端口。

  5. 浏览器访问:

    打开浏览器,访问 http://127.0.0.1:8000/,你将看到Django的欢迎页面。

以下是相关的代码示例:

pip install django
django-admin startproject myproject
cd myproject
python manage.py runserver
Bash

这些命令会创建一个名为 myproject 的Django项目,并启动一个本地开发服务器,你可以在浏览器中访问这个项目。

2024-09-04

第七章的主题是Django用户认证与会话技术。这里我们不需要实际的代码,但是我们可以展示如何使用Django的认证后台来创建用户,登录用户,以及验证用户的会话。

  1. 创建用户:
from django.contrib.auth.models import User

# 创建一个新用户
user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

# 我们也可以在创建用户时指定其他字段
user = User.objects.create_user(
  username='jane',
  email='jane@beatles.com',
  password='janepassword',
  first_name='Jane',
  last_name='Doe',
)
Python
  1. 用户登录:
from django.contrib.auth import authenticate, login

# 使用用户名和密码登录用户
user = authenticate(request, username='john', password='johnpassword')

if user is not None:
  if user.is_active:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return a 'disabled account' error message
    ...
else:
  # Return an 'invalid login' error message.
  ...
Python
  1. 检查用户是否已登录:
# 在视图中
def my_view(request):
  if request.user.is_authenticated:
    # 用户已登录
    ...
  else:
    # 用户未登录
    ...
Python
  1. 用户登出:
from django.contrib.auth import logout

def logout_view(request):
  logout(request)
  # Redirect to a success page.
  ...
Python

这些代码片段展示了如何在Django中创建用户,登录用户,检查用户是否登录,以及用户登出。这些是用户认证和会话管理的基本操作,对于任何Web应用程序都是必不可少的。

2024-09-04

在Django中实现文章标签推荐功能,可以通过计算文章标签的相似度来推荐其他文章。以下是一个简化的示例,展示了如何在Django模型中实现标签推荐:

from django.db import models
from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.models import ContentType
from taggit.managers import TaggableManager

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    tags = TaggableManager()
    recommendations = GenericRelation('Recommendation')

    def __str__(self):
        return self.title

class Recommendation(models.Model):
    content_object = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_object', 'object_id')
    reason = models.CharField(max_length=200)

    def __str__(self):
        return f"{self.content_object} - {self.reason}"

# 推荐相似标签的文章逻辑示例
from taggit.models import TaggedItem

def recommend_similar_tags(article):
    # 获取文章的标签
    tags = article.tags.all()
    # 查询具有相同标签的其他文章
    similar_articles = Article.objects.filter(tags__in=tags).exclude(id=article.id)
    # 计算推荐的原因,例如基于标签的相似度
    for similar_article in similar_articles:
        tags_in_common = TaggedItem.objects.filter(content_type=ContentType.objects.get_for_model(Article),
                                                   object_id=similar_article.id).intersection(article.tags.all())
        reason = f"基于共同的标签:{', '.join([tag.name for tag in tags_in_common])}"
        Recommendation.objects.create(content_object=article, reason=reason)
Python

在这个示例中,我们定义了一个Article模型,它有一个tags字段来存储文章的标签,以及一个recommendations字段来存储推荐。recommend_similar_tags函数计算与指定文章具有相同标签的其他文章,并创建推荐关系。这个函数可以在文章查看的信号中触发,或者在文章保存后手动调用。

2024-09-04

在Django中,我们可以使用内置的User模型作为我们的用户认证系统。以下是如何在Django中创建一个新用户的例子:

from django.contrib.auth.models import User

# 创建一个新用户
def create_new_user(username, email, password):
    user = User.objects.create_user(username=username, email=email, password=password)
    user.save()
    return user

# 使用函数创建用户
new_user = create_new_user('new_user', 'new_user@example.com', 'password123')
Python

在这个例子中,我们首先从Django的auth应用中导入了User模型。然后我们定义了一个函数create_new_user,它接受用户名、电子邮件和密码作为参数,并使用这些信息创建了一个新的用户对象。最后,我们调用这个函数来创建一个新用户。

2024-09-04

在Django中,深入理解模板是非常重要的,因为模板是表达数据和逻辑的主要方式。以下是一些关于Django模板的进阶技巧和示例代码。

  1. 模板继承:使用模板继承可以创建一个基本的框架模板,然后在子模板中进行个性化定制。
<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <header>
        <!-- 头部信息 -->
    </header>

    <main>
        {% block content %}
        <!-- 主体内容 -->
        {% endblock %}
    </main>

    <footer>
        <!-- 底部信息 -->
    </footer>
</body>
</html>
HTML
<!-- child.html -->
{% extends "base.html" %}

{% block title %}My Page Title{% endblock %}

{% block content %}
<!-- 子模板特有的内容 -->
<h1>Welcome to my page!</h1>
{% endblock %}
HTML
  1. 自定义模板标签和过滤器:可以创建自定义的模板标签和过滤器来增强模板的功能。
# my_tags.py
from django import template

register = template.Library()

@register.filter(name='add_str')
def add_str(value, arg):
    return value + arg
Python
<!-- 在模板中使用自定义过滤器 -->
{% load my_tags %}
{{ "Hello"|add_str:" World!" }}  <!-- 输出: Hello World! -->
HTML
  1. 模板的组件化:通过包含({% include %})标签将模板拆分成更小的组件。
<!-- header.html -->
<header>
    <!-- 头部内容 -->
</header>
HTML
<!-- 主模板使用包含标签 -->
{% include "header.html" %}
<main>
    <!-- 主体内容 -->
</main>
HTML
  1. 模板的动态内容:模板中可以包含动态内容,使用{{ 变量 }}来表示。
<!-- 动态内容示例 -->
<h1>{{ welcome_message }}</h1>
HTML
  1. 模板的循环:使用{% for %}标签在模板中创建循环。
<!-- 循环示例 -->
<ul>
{% for item in items_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>
HTML
  1. 模板的条件:使用{% if %}{% elif %}以及{% else %}标签在模板中创建条件判断。
<!-- 条件判断示例 -->
{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}!</p>
{% else %}
    <p>Welcome, guest!</p>
{% endif %}
HTML

以上代码片段展示了模板继承、自定义标签和过滤器、模板组件化、动态内容展示、循环处理和条件判断在模板中的应用。这些是Django模板开发的核心技术,有助于开发者创建功能丰富、结构清晰的网页模板。

2024-09-04
# 安装Django Debug Toolbar
pip install django-debug-toolbar

# 将debug_toolbar添加到你的INSTALLED_APPS设置中
INSTALLED_APPS = [
    # ...
    'debug_toolbar',
    # ...
]

# 在中间件中添加Debug Toolbar中间件
MIDDLEWARE = [
    # ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    # ...
]

# 如果你使用的是Django 2.x,请在settings.py中添加以下配置
INTERNAL_IPS = [
    # ...
    '127.0.0.1',
    # ...
]

# 如果你使用的是Django 3.x或更高版本,Debug Toolbar已支持Django 3.x,不需要额外配置INTERNAL_IPS

# 运行收集static命令
python manage.py collectstatic

# 重启Django开发服务器
python manage.py runserver
Python

以上代码展示了如何安装和配置Django Debug Toolbar。在配置完成后,重启Django开发服务器,并且确保你的浏览器访问服务器时使用的是内部IP地址,Debug Toolbar将会在页面底部显示渲染时间等调试信息。

2024-09-04

在Django项目中使用Daphne启动的示例代码如下:

首先,确保你已经安装了Daphne:

pip install daphne
Bash

然后,在项目的asgi.py文件中,通常在Django项目的根目录下,你需要定义一个ASGI应用。假设你的Django项目名为myproject,那么asgi.py文件可能如下所示:

import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

application = get_asgi_application()
Python

现在,你可以使用Daphne来运行你的Django项目:

daphne myproject.asgi:application
Bash

如果你的Django项目使用了信号或者定时任务,你可能还需要配置对应的工作进程数量,可以通过Daphne的命令行参数来设置,例如:

daphne myproject.asgi:application --port 8000 --proxy-headers --workers 4
Bash

这里,--port 8000 设置了Daphne监听的端口为8000,--proxy-headers 使Daphne信任代理服务器传递的头信息,--workers 4 设置了4个工作进程。

以上命令假设你的Django项目已经配置好并且可以通过python manage.py runserver正常运行。使用Daphne可以提供更高效的性能,尤其是在处理长连接和实时通信时。

2024-09-04
# 导入Django和Django REST framework的相关模块
from django.contrib.auth.models import User
from rest_framework import generics, permissions, authentication
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.reverse import reverse
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler

# 自定义的JWT认证视图
class ObtainJSONWebToken(generics.GenericAPIView):
    serializer_class = JSONWebTokenSerializer
    permission_classes = (permissions.AllowAny,)

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token = jwt_encode_handler(jwt_payload_handler(user))
        return Response({
            'token': token,
            'user': user.username,  # 返回用户名
            'email': user.email  # 返回用户邮箱
        })

# 自定义的JWT序列化器
class JSONWebTokenSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        # 使用Django的内置authenticate方法来验证用户名和密码
        user = authenticate(**data)
        if user:
            return user
        raise serializers.ValidationError("无效的凭证")

# 使用Django REST framework的版本控制来处理不同版本间的兼容性问题
from rest_framework.versioning import QueryParameterVersioning

# 视图集或视图的版本控制设置
class MyView(generics.GenericAPIView):
    versioning_class = QueryParameterVersioning
    ...
Python

这个代码实例展示了如何在Django项目中使用JWT进行身份验证,并且包含了版本控制的概念,以确保API的不同版本之间保持兼容性。在这个例子中,我们定义了一个自定义的ObtainJSONWebToken类来处理登录请求,并且使用了QueryParameterVersioning来通过URL参数(如?version=1)来指定API的版本。这个例子简洁而完整,展示了如何将JWT和版本控制结合使用以构建安全且可维护的后端服务。

2024-09-04

在Mac上安装Django和连接MySQL的步骤如下:

  1. 安装Django:

    打开终端,运行以下命令来安装Django:

pip install django
Bash
  1. 安装MySQL客户端库:

    Django默认使用SQLite数据库,但你可能想使用MySQL。首先,你需要安装MySQL客户端库。如果你已经安装了mysql-client,可以跳过这一步。如果没有,可以使用Homebrew安装:

brew install mysql-client
Bash
  1. 安装Python的MySQL数据库适配器:

    Django通过数据库适配器与数据库进行通信。你可以选择mysqlclientpymysql作为MySQL的适配器。这里我们安装mysqlclient

pip install mysqlclient
Bash
  1. 创建一个新的Django项目:
django-admin startproject myproject
Bash
  1. 配置Django项目使用MySQL数据库:

    在你的Django项目的settings.py文件中,找到DATABASES设置,并修改如下,确保填写正确的MySQL用户、密码和数据库名:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',   # Or an IP Address that your MySQL server is hosted on
        'PORT': '3306',
    }
}
Python
  1. 迁移数据库:
python manage.py makemigrations
python manage.py migrate
Bash

这些步骤会在你的Mac上安装Django,并设置你的项目使用MySQL数据库。记得替换mydatabase, mydatabaseuser, mypassword以及其他配置信息以匹配你的MySQL设置。