|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。对于初学者来说,从零开始创建一个Django项目可能会感到有些挑战,但本指南将带你一步步完成整个过程,包括环境搭建、项目创建、基础配置、数据库设置、静态文件处理、URL路由以及常见问题解决方案。
1. 环境搭建
在开始创建Django项目之前,我们需要先搭建好开发环境。
1.1 安装Python
Django是基于Python的Web框架,所以首先需要安装Python。访问Python官网(https://www.python.org/)下载并安装最新稳定版的Python。
安装完成后,打开终端或命令提示符,输入以下命令验证Python是否安装成功:
或者:
1.2 创建虚拟环境
虚拟环境可以为每个项目创建独立的Python环境,避免不同项目之间的包冲突。使用以下命令创建虚拟环境:
在Windows上:
在macOS或Linux上:
创建完成后,激活虚拟环境:
在Windows上:
在macOS或Linux上:
- source myenv/bin/activate
复制代码
激活后,终端提示符前会显示虚拟环境的名称。
1.3 安装Django
在虚拟环境中,使用pip安装Django:
安装完成后,可以通过以下命令验证Django是否安装成功:
2. 项目创建
环境搭建完成后,我们可以开始创建Django项目。
2.1 创建项目
使用Django的管理命令django-admin startproject创建新项目:
- django-admin startproject myproject
复制代码
这将在当前目录下创建一个名为myproject的文件夹,其中包含以下文件结构:
- myproject/
- manage.py
- myproject/
- __init__.py
- settings.py
- urls.py
- asgi.py
- wsgi.py
复制代码
2.2 项目结构说明
• manage.py:Django项目的命令行工具,用于与项目进行交互。
• myproject/:项目的Python包,包含项目的配置文件。__init__.py:空文件,告诉Python这个目录应该被视为一个Python包。settings.py:项目的配置文件,包含所有项目设置。urls.py:项目的URL声明,Django会根据这个文件来匹配URL。asgi.py:用于ASGI兼容的Web服务器服务项目的入口。wsgi.py:用于WSGI兼容的Web服务器服务项目的入口。
• __init__.py:空文件,告诉Python这个目录应该被视为一个Python包。
• settings.py:项目的配置文件,包含所有项目设置。
• urls.py:项目的URL声明,Django会根据这个文件来匹配URL。
• asgi.py:用于ASGI兼容的Web服务器服务项目的入口。
• wsgi.py:用于WSGI兼容的Web服务器服务项目的入口。
• __init__.py:空文件,告诉Python这个目录应该被视为一个Python包。
• settings.py:项目的配置文件,包含所有项目设置。
• urls.py:项目的URL声明,Django会根据这个文件来匹配URL。
• asgi.py:用于ASGI兼容的Web服务器服务项目的入口。
• wsgi.py:用于WSGI兼容的Web服务器服务项目的入口。
2.3 开发服务器
进入项目目录,启动开发服务器:
- cd myproject
- python manage.py runserver
复制代码
启动成功后,在浏览器中访问http://127.0.0.1:8000/,你将看到Django的欢迎页面。
3. 基础配置
3.1 settings.py文件详解
settings.py是Django项目的核心配置文件,让我们看看其中的一些重要设置:
- # 项目根目录
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- # 安全设置
- SECRET_KEY = 'django-insecure-your-secret-key-here'
- DEBUG = True
- ALLOWED_HOSTS = []
- # 应用定义
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- ]
- # 中间件
- MIDDLEWARE = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- ]
- # URL配置
- ROOT_URLCONF = 'myproject.urls'
- # 模板配置
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
- ]
- # 数据库配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- }
- }
- # 国际化
- LANGUAGE_CODE = 'en-us'
- TIME_ZONE = 'UTC'
- USE_I18N = True
- USE_L10N = True
- USE_TZ = True
- # 静态文件配置
- STATIC_URL = '/static/'
复制代码
3.2 常用配置修改
默认情况下,Django使用英语和UTC时区。我们可以修改为中文和本地时区:
- LANGUAGE_CODE = 'zh-hans'
- TIME_ZONE = 'Asia/Shanghai'
复制代码
在开发环境中,DEBUG = True时,ALLOWED_HOSTS可以为空。但在生产环境中,我们需要设置允许访问的主机:
- ALLOWED_HOSTS = ['example.com', 'www.example.com']
复制代码
默认情况下,Django使用SQLite数据库。如果要使用MySQL或PostgreSQL,可以这样配置:
MySQL配置:
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'mydatabase',
- 'USER': 'mydatabaseuser',
- 'PASSWORD': 'mypassword',
- 'HOST': 'localhost',
- 'PORT': '3306',
- }
- }
复制代码
PostgreSQL配置:
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'mydatabase',
- 'USER': 'mydatabaseuser',
- 'PASSWORD': 'mypassword',
- 'HOST': 'localhost',
- 'PORT': '5432',
- }
- }
复制代码
4. 创建应用
在Django中,一个项目可以包含多个应用。应用是一个Web应用程序,它执行特定的功能,例如博客系统、数据记录等。
4.1 创建应用
使用以下命令创建一个名为blog的应用:
- python manage.py startapp blog
复制代码
这将在项目目录下创建一个blog文件夹,其中包含以下文件结构:
- blog/
- __init__.py
- admin.py
- apps.py
- migrations/
- __init__.py
- models.py
- tests.py
- views.py
复制代码
4.2 注册应用
创建应用后,我们需要在settings.py文件中的INSTALLED_APPS列表中注册它:
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'blog', # 添加这一行
- ]
复制代码
5. 数据库设置
5.1 创建模型
模型是数据的唯一、权威的来源,它包含你存储的数据的基本字段和行为。在blog/models.py中定义模型:
- from django.db import models
- from django.contrib.auth.models import User
- class Category(models.Model):
- name = models.CharField(max_length=100)
- description = models.TextField(blank=True)
-
- def __str__(self):
- return self.name
- class Tag(models.Model):
- name = models.CharField(max_length=100)
-
- def __str__(self):
- return self.name
- class Post(models.Model):
- title = models.CharField(max_length=200)
- content = models.TextField()
- created_date = models.DateTimeField(auto_now_add=True)
- updated_date = models.DateTimeField(auto_now=True)
- author = models.ForeignKey(User, on_delete=models.CASCADE)
- category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
- tags = models.ManyToManyField(Tag, blank=True)
-
- def __str__(self):
- return self.title
- class Comment(models.Model):
- post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
- author = models.ForeignKey(User, on_delete=models.CASCADE)
- content = models.TextField()
- created_date = models.DateTimeField(auto_now_add=True)
-
- def __str__(self):
- return f'Comment by {self.author} on {self.post}'
复制代码
5.2 数据库迁移
定义模型后,我们需要创建并应用数据库迁移:
- # 创建迁移文件
- python manage.py makemigrations
- # 应用迁移
- python manage.py migrate
复制代码
5.3 数据库操作
Django提供了丰富的API来进行数据库操作。以下是一些常见的数据库操作示例:
- from blog.models import Category, Post, Tag
- from django.contrib.auth.models import User
- # 创建分类
- category = Category.objects.create(name="技术", description="技术相关文章")
- # 创建标签
- tag1 = Tag.objects.create(name="Python")
- tag2 = Tag.objects.create(name="Django")
- # 获取用户
- user = User.objects.get(username='admin')
- # 创建文章
- post = Post.objects.create(
- title="Django入门教程",
- content="这是一个关于Django的入门教程...",
- author=user,
- category=category
- )
- post.tags.add(tag1, tag2)
复制代码- # 获取所有文章
- all_posts = Post.objects.all()
- # 获取特定条件的文章
- python_posts = Post.objects.filter(tags__name="Python")
- # 获取单篇文章
- post = Post.objects.get(id=1)
- # 排序
- recent_posts = Post.objects.order_by('-created_date')
- # 限制数量
- latest_posts = Post.objects.order_by('-created_date')[:5]
复制代码- post = Post.objects.get(id=1)
- post.title = "更新后的标题"
- post.content = "更新后的内容..."
- post.save()
- # 批量更新
- Post.objects.filter(category__name="技术").update(title="[技术] " + F('title'))
复制代码- post = Post.objects.get(id=1)
- post.delete()
- # 批量删除
- Post.objects.filter(category__name="旧分类").delete()
复制代码
6. 静态文件处理
静态文件包括CSS、JavaScript、图片等文件。Django提供了专门的方式来处理这些文件。
6.1 静态文件配置
在settings.py中,Django已经为我们提供了基本的静态文件配置:
我们还可以添加以下配置:
- # 静态文件目录
- STATICFILES_DIRS = [
- os.path.join(BASE_DIR, 'static'),
- ]
- # 收集的静态文件存储目录
- STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
复制代码
6.2 项目静态文件结构
在项目根目录下创建一个static文件夹,并在其中创建相应的子文件夹:
6.3 在模板中使用静态文件
要在模板中使用静态文件,首先在模板顶部加载静态文件标签:
然后,可以使用static标签引用静态文件:
- <!DOCTYPE html>
- <html>
- <head>
- <title>My Blog</title>
- <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
- </head>
- <body>
- <h1>Welcome to My Blog</h1>
- <img src="{% static 'images/logo.png' %}" alt="Logo">
- <script src="{% static 'js/main.js' %}"></script>
- </body>
- </html>
复制代码
6.4 应用静态文件
每个应用也可以有自己的静态文件。在应用目录下创建static文件夹,并按照<app_name>/<static_file>的结构组织文件。例如,对于blog应用:
- blog/
- static/
- blog/
- css/
- style.css
- js/
- main.js
- images/
- logo.png
复制代码
在模板中引用这些文件:
- {% load static %}
- <link rel="stylesheet" type="text/css" href="{% static 'blog/css/style.css' %}">
复制代码
6.5 收集静态文件
在生产环境中,我们需要使用collectstatic命令将所有静态文件收集到STATIC_ROOT指定的目录中:
- python manage.py collectstatic
复制代码
7. URL路由
URL路由是Django将请求的URL映射到相应视图函数的过程。
7.1 项目URL配置
项目的主URL配置文件是myproject/urls.py。默认情况下,它包含以下内容:
- from django.contrib import admin
- from django.urls import path
- urlpatterns = [
- path('admin/', admin.site.urls),
- ]
复制代码
7.2 应用URL配置
为了保持代码的整洁,我们通常在每个应用中创建自己的URL配置文件。在blog应用目录下创建urls.py文件:
- from django.urls import path
- from . import views
- app_name = 'blog'
- urlpatterns = [
- path('', views.post_list, name='post_list'),
- path('post/<int:pk>/', views.post_detail, name='post_detail'),
- path('post/new/', views.post_new, name='post_new'),
- path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
- path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
- ]
复制代码
然后,在项目的URL配置文件中包含应用的URL配置:
- from django.contrib import admin
- from django.urls import path, include
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('blog/', include('blog.urls')),
- ]
复制代码
7.3 创建视图函数
视图函数接收Web请求并返回Web响应。在blog/views.py中创建视图函数:
- from django.shortcuts import render, get_object_or_404, redirect
- from .models import Post
- from .forms import PostForm
- from django.contrib.auth.decorators import login_required
- def post_list(request):
- posts = Post.objects.all().order_by('-created_date')
- return render(request, 'blog/post_list.html', {'posts': posts})
- def post_detail(request, pk):
- post = get_object_or_404(Post, pk=pk)
- return render(request, 'blog/post_detail.html', {'post': post})
- @login_required
- def post_new(request):
- if request.method == "POST":
- form = PostForm(request.POST)
- if form.is_valid():
- post = form.save(commit=False)
- post.author = request.user
- post.save()
- return redirect('blog:post_detail', pk=post.pk)
- else:
- form = PostForm()
- return render(request, 'blog/post_edit.html', {'form': form})
- @login_required
- def post_edit(request, pk):
- post = get_object_or_404(Post, pk=pk)
- if request.method == "POST":
- form = PostForm(request.POST, instance=post)
- if form.is_valid():
- post = form.save(commit=False)
- post.author = request.user
- post.save()
- return redirect('blog:post_detail', pk=post.pk)
- else:
- form = PostForm(instance=post)
- return render(request, 'blog/post_edit.html', {'form': form})
- @login_required
- def post_delete(request, pk):
- post = get_object_or_404(Post, pk=pk)
- if request.method == "POST":
- post.delete()
- return redirect('blog:post_list')
- return render(request, 'blog/post_delete.html', {'post': post})
复制代码
7.4 创建表单
在blog应用目录下创建forms.py文件:
- from django import forms
- from .models import Post, Comment
- class PostForm(forms.ModelForm):
- class Meta:
- model = Post
- fields = ('title', 'content', 'category', 'tags')
- class CommentForm(forms.ModelForm):
- class Meta:
- model = Comment
- fields = ('content',)
复制代码
7.5 创建模板
在blog应用目录下创建templates/blog文件夹,并在其中创建模板文件。
- {% load static %}
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>{% block title %}My Blog{% endblock %}</title>
- <link rel="stylesheet" href="{% static 'css/style.css' %}">
- </head>
- <body>
- <header>
- <h1><a href="{% url 'blog:post_list' %}">My Blog</a></h1>
- <nav>
- <a href="{% url 'blog:post_list' %}">Home</a>
- {% if user.is_authenticated %}
- <a href="{% url 'blog:post_new' %}">New Post</a>
- <a href="{% url 'admin:logout' %}">Logout ({{ user.username }})</a>
- {% else %}
- <a href="{% url 'admin:login' %}">Login</a>
- {% endif %}
- </nav>
- </header>
-
- <main>
- {% block content %}
- {% endblock %}
- </main>
-
- <footer>
- <p>© {% now "Y" %} My Blog</p>
- </footer>
- </body>
- </html>
复制代码- {% extends "blog/base.html" %}
- {% block title %}Blog Posts{% endblock %}
- {% block content %}
- <h1>Blog Posts</h1>
-
- {% for post in posts %}
- <article>
- <h2><a href="{% url 'blog:post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
- <p class="meta">
- Posted by {{ post.author }} on {{ post.created_date|date:"F j, Y" }}
- in {{ post.category }}
- </p>
- <p>{{ post.content|truncatewords:30 }}</p>
- <p>
- <a href="{% url 'blog:post_detail' pk=post.pk %}">Read more</a>
- </p>
- </article>
- {% empty %}
- <p>No posts yet.</p>
- {% endfor %}
- {% endblock %}
复制代码- {% extends "blog/base.html" %}
- {% block title %}{{ post.title }}{% endblock %}
- {% block content %}
- <article>
- <h1>{{ post.title }}</h1>
- <p class="meta">
- Posted by {{ post.author }} on {{ post.created_date|date:"F j, Y" }}
- in {{ post.category }}
- </p>
- <div class="content">
- {{ post.content|linebreaks }}
- </div>
-
- <div class="tags">
- <p>Tags:
- {% for tag in post.tags.all %}
- <span class="tag">{{ tag.name }}</span>
- {% empty %}
- No tags
- {% endfor %}
- </p>
- </div>
-
- {% if user.is_authenticated and user == post.author %}
- <div class="post-actions">
- <a href="{% url 'blog:post_edit' pk=post.pk %}">Edit</a>
- <a href="{% url 'blog:post_delete' pk=post.pk %}">Delete</a>
- </div>
- {% endif %}
- </article>
-
- <section class="comments">
- <h2>Comments</h2>
- {% for comment in post.comments.all %}
- <div class="comment">
- <p class="meta">
- Posted by {{ comment.author }} on {{ comment.created_date|date:"F j, Y, g:i a" }}
- </p>
- <p>{{ comment.content|linebreaks }}</p>
- </div>
- {% empty %}
- <p>No comments yet.</p>
- {% endfor %}
-
- {% if user.is_authenticated %}
- <h3>Add a comment</h3>
- <form method="post" action="{% url 'blog:add_comment' pk=post.pk %}">
- {% csrf_token %}
- {{ comment_form.as_p }}
- <button type="submit">Submit</button>
- </form>
- {% endif %}
- </section>
- {% endblock %}
复制代码- {% extends "blog/base.html" %}
- {% block title %}{% if form.instance.pk %}Edit Post{% else %}New Post{% endif %}{% endblock %}
- {% block content %}
- <h1>{% if form.instance.pk %}Edit Post{% else %}New Post{% endif %}</h1>
-
- <form method="post">
- {% csrf_token %}
- {{ form.as_p }}
- <button type="submit">Save</button>
- </form>
- {% endblock %}
复制代码- {% extends "blog/base.html" %}
- {% block title %}Delete Post{% endblock %}
- {% block content %}
- <h1>Delete Post</h1>
-
- <p>Are you sure you want to delete the post "{{ post.title }}"?</p>
-
- <form method="post">
- {% csrf_token %}
- <button type="submit" class="confirm-delete">Yes, delete</button>
- <a href="{% url 'blog:post_detail' pk=post.pk %}" class="cancel">Cancel</a>
- </form>
- {% endblock %}
复制代码
8. 常见问题解决方案
8.1 数据库迁移问题
解决方案:
1. 检查模型定义是否有语法错误。
2. 删除migrations文件夹中除了__init__.py之外的所有文件。
3. 删除数据库文件(SQLite)或清空数据库表。
4. 重新执行makemigrations和migrate命令。
- # 删除所有迁移文件(保留__init__.py)
- find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
- find . -path "*/migrations/*.pyc" -delete
- # 重新创建迁移
- python manage.py makemigrations
- # 应用迁移
- python manage.py migrate
复制代码
8.2 静态文件问题
解决方案:
1. 检查settings.py中的静态文件配置是否正确。
2. 确保在模板中加载了静态文件标签:{% load static %}。
3. 检查静态文件路径是否正确。
4. 运行collectstatic命令收集静态文件:
- python manage.py collectstatic
复制代码
1. 确保Web服务器(如Nginx)正确配置了静态文件的提供。
8.3 URL路由问题
解决方案:
1. 检查URL配置是否正确。
2. 确保视图函数存在且名称正确。
3. 检查URL模式中的参数是否与视图函数的参数匹配。
4. 使用django.urls.reverse或模板中的url标签生成URL,而不是硬编码URL。
8.4 模板问题
解决方案:
1. 检查模板语法是否正确,特别是闭合标签。
2. 确保视图函数传递了模板所需的所有上下文变量。
3. 使用Django调试工具栏检查模板上下文。
4. 在模板中使用{% debug %}标签调试上下文变量。
8.5 表单问题
解决方案:
1. 检查表单字段定义是否与模型字段匹配。
2. 确保表单在视图中正确处理POST请求。
3. 在模板中显示表单错误:
- {% if form.errors %}
- <div class="error">
- {{ form.errors }}
- </div>
- {% endif %}
复制代码
1. 检查表单的is_valid()方法是否返回True。
2. 确保在表单中包含了CSRF令牌:{% csrf_token %}。
8.6 权限问题
解决方案:
1. 检查视图函数是否使用了正确的装饰器,如@login_required。
2. 确保用户具有执行特定操作的权限。
3. 在模板中使用条件语句检查用户权限:
- {% if user.is_authenticated %}
- <!-- 显示给已认证用户的内容 -->
- {% else %}
- <!-- 显示给未认证用户的内容 -->
- {% endif %}
复制代码
1. 检查Django的认证后端是否正确配置。
8.7 性能问题
解决方案:
1. 使用Django调试工具栏检查数据库查询。
2. 使用select_related或prefetch_related优化查询:
- # 不优化的查询(导致N+1查询问题)
- posts = Post.objects.all()
- for post in posts:
- print(post.category.name) # 每次访问都会触发一次数据库查询
- # 优化后的查询
- posts = Post.objects.select_related('category').all()
- for post in posts:
- print(post.category.name) # 不会触发额外的数据库查询
复制代码
1. 使用缓存减少数据库查询:
- from django.core.cache import cache
- def get_popular_posts():
- popular_posts = cache.get('popular_posts')
- if popular_posts is None:
- popular_posts = Post.objects.order_by('-views')[:10]
- cache.set('popular_posts', popular_posts, 3600) # 缓存1小时
- return popular_posts
复制代码
1. 使用分页减少单页加载的数据量:
- from django.core.paginator import Paginator
- def post_list(request):
- posts_list = Post.objects.all()
- paginator = Paginator(posts_list, 10) # 每页10篇文章
- page = request.GET.get('page')
- posts = paginator.get_page(page)
- return render(request, 'blog/post_list.html', {'posts': posts})
复制代码
9. 部署Django项目
9.1 准备生产环境设置
创建一个单独的生产环境设置文件,例如myproject/settings_production.py:
- from .settings import *
- # 安全设置
- DEBUG = False
- ALLOWED_HOSTS = ['example.com', 'www.example.com']
- # 数据库配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'mydatabase',
- 'USER': 'mydatabaseuser',
- 'PASSWORD': 'mypassword',
- 'HOST': 'localhost',
- 'PORT': '5432',
- }
- }
- # 静态文件
- STATIC_ROOT = '/var/www/myproject/static/'
- MEDIA_ROOT = '/var/www/myproject/media/'
- # 安全设置
- SECURE_SSL_REDIRECT = True
- SESSION_COOKIE_SECURE = True
- CSRF_COOKIE_SECURE = True
- SECURE_BROWSER_XSS_FILTER = True
- SECURE_CONTENT_TYPE_NOSNIFF = True
复制代码
9.2 使用Gunicorn作为应用服务器
安装Gunicorn:
启动Gunicorn:
- gunicorn myproject.wsgi:application
复制代码
9.3 使用Nginx作为Web服务器
配置Nginx:
- server {
- listen 80;
- server_name example.com www.example.com;
- location = /favicon.ico { access_log off; log_not_found off; }
- location /static/ {
- root /var/www/myproject;
- }
- location /media/ {
- root /var/www/myproject;
- }
- location / {
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_pass http://unix:/run/gunicorn.sock;
- }
- }
复制代码
9.4 使用Systemd管理Gunicorn进程
创建Systemd服务文件/etc/systemd/system/gunicorn.service:
- [Unit]
- Description=gunicorn daemon
- After=network.target
- [Service]
- User=www-data
- Group=www-data
- WorkingDirectory=/var/www/myproject
- ExecStart=/var/www/myproject/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
- [Install]
- WantedBy=multi-user.target
复制代码
启动并启用Gunicorn服务:
- sudo systemctl start gunicorn
- sudo systemctl enable gunicorn
复制代码
10. 总结
本指南详细介绍了从零开始创建Django项目的完整过程,包括环境搭建、项目创建、基础配置、数据库设置、静态文件处理、URL路由以及常见问题解决方案。通过遵循这些步骤,你应该能够创建一个功能完整的Django Web应用程序。
Django是一个功能强大且灵活的Web框架,它提供了许多内置功能,如ORM、表单处理、用户认证等,使Web开发变得更加高效。随着你对Django的深入了解,你还可以探索更多高级功能,如REST框架、Celery任务队列、Django Channels等,以构建更复杂的应用程序。
要继续学习Django,以下是一些有用的资源:
• Django官方文档
• Django Girls教程
• Django for Professionals
• Test-Driven Development with Python
希望本指南能帮助你开始Django开发之旅! |
|