django入门

这篇博客介绍了Django的官方文档资源,包括安装和入门教程,并详细讲解了如何在VSCode中配置和调试Django项目。遇到的问题是全局安装模块(如Django和scons)以及在虚拟环境中激活调试。同时,文章还涉及到Django的用户权限、模板使用、多应用管理和应用配置。此外,还探讨了Django中的线程管理和优雅退出策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐官方文档
https://www.djangoproject.com/start/
https://docs.djangoproject.com/en/4.1/intro/install/
https://docs.djangoproject.com/en/4.1/intro/tutorial02/

Django实现登录功能
https://blog.youkuaiyun.com/if9600/article/details/115178554
以上都看一下。

在vscode中调试Django

新建Django的调试

{
     "name": "Python: Django",
    "type": "python",
    "request": "launch",
    "program": "${workspaceFolder}\\manage.py",
    "args": [
        "runserver"
    ],
    "django": true,
    "justMyCode": true
}

开发的时候使用的是python的虚拟环境,可是启动调试的时候,会打开新的terminal启动python进程。
python的选择是在Ctrl+Shift+P中选择Python Intercepter.
可是我的vscode无法选择venv中的python.exe.
所以只好在Python的系统环境中安装Django。
另外尝试在launch之前激活虚拟环境,也没找到途径,后续找到解决办法在补充吧。

全局安装python模块的另外一个是scons,如果在awtk designer应用中package res,就是系统级别的scons命令调用,所以也需要全局安装。

Django用户权限

Django Auth用户与用户组详述
http://c.biancheng.net/view/8001.html

  • Django判断登录
if request.user.is_authenticated():
	# 如果登录返回用户想去的页面
	return render(request, "用户想去页面")
else:
	# 未登录, 重定向到用户登录页面
	return redirect(reverse("登录页面"))
————————————————
版权声明:本文为优快云博主「忘记以前」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/itpedestrian/article/details/99703397
  • Django用户组
request.user.groups.all()

Django模板

django学习-7.html模板中include标签使用场景
https://www.cnblogs.com/xiamen-momo/p/14101841.html

Django 多app

参考: django中Appconfig

  • django的project由多个app组成。
  • project的设置由setting指定,而每个app的设置由AppConfig指定。
  • app和project主要由INSTALL_APPS联系,也有url和middleware等等.

Django主要还是url配置。如果没有将app进行安装,其实也可以用其他app的url,但是Django不会管理这个app。

什么是管理?
管理之前,一个app文件夹就是一堆代码,其他模块可以调用,跟Django关系不对。
如果INSTALL_APPS管理app之后,比如可以收到Django的一些信号了,就是跟Django有关联了。

class KingConfig(AppConfig):
    name = 'king'
	
	# king没有加入到INSTALL_APPS中,ready代码是不会执行的。
    def ready(self):
        print(f'{self} ...')
        _init(self)
        post_init.connect(init_modules, sender=self)
class AppConfig:
    ...
    def ready(self):
        """
        Override this method in subclasses to run code when Django starts.
        """

How dose Django gracefully exit?

Django中启动thread,那么thread如果优雅的关闭?
跟上面的app管理有关.

  • 接收Django的关闭信号,自己写关闭
  • 如果线程中有等待怎么办?
from django.apps import AppConfig
from django.db.models.signals import post_init, pre_delete
import signal
import sys

t_cleaner = (CacheCleaner(CACHE_DIR, 't_cache'))

def quit_gracefully(signal, frame, **kwargs):
    destroy_modules()
    sys.exit(0)

def init_modules(sender, **kwargs): 
    
    signal.signal(signal.SIGINT, quit_gracefully)
    signal.signal(signal.SIGTERM, quit_gracefully)

    s_log(f'启动图片定时清理 .. {CACHE_DIR}')
    t_cleaner.start()
    s_log("t_cleaner startsuccess!")


def destroy_modules(): 
    s_log(f'关闭图片定时清理')
    t_cleaner.cancel()


class KingConfig(AppConfig):
    name = 'king'

    def ready(self):
        print(f'{self} ...')
        init_modules(self)

如果线程中有等待如何立即退出?

使用threading.Event中的锁来休眠和唤醒

# -*- coding: utf-8 -*-
import os
import shutil
import threading
import time

class CacheThread(threading.Thread):
    def __init__(self, name, delay=0, interval=10):
        super().__init__(name=name)
        self.name = name
        self.delay = delay
        self.interval = interval
        self.state = 0  # 运行状态
        self.wait_state = 0  # 等待状态
        self.event = threading.Event()

    def cancel(self):
        self.state = 0
        if self.wait_state == 1:
            self.event.set()

    def run(self):
        self.state = 1

        if self.state == 1 and self.delay > 0:
            self.wait_state = 1
            self.event.wait(self.delay)
        
        while self.state:
            self.do_task()

            self.wait_state = 1
            self.event.wait(self.interval)
        s_log(f'Task stopped. \n', self.name)
 

    def do_task(self):
        s_log('performed a task. <<<<<<<<<')

如何避免AppConfig.ready被执行两次

class Apps:
    ....
    def populate(self, installed_apps=None):    
            ....
            # Phase 1: initialize app configs and import app modules.
            for entry in installed_apps:
                if isinstance(entry, AppConfig):
                    app_config = entry
                else:
                    app_config = AppConfig.create(entry)
                    
            # Phase 3: run ready() methods of app configs.
            for app_config in self.get_app_configs():
                app_config.ready()

开发的时候增加一个参数--noreload

python3 manage.py runserver 0.0.0.0:8000 --noreload

内部线程休眠阻塞代码reload

前面提到在Django中启动线程,在Django结束时优雅的退出,线程存在休眠;长时间休眠会阻塞reload
reload实际执行的是sys.exit(3)sys.exit会等待所有线程的退出。

暂时的解决:缩短休眠时长。

### Django 入门教程基础使用指南 #### 1. 安装Django环境 为了开始使用Django,首先需要将其安装到本地环境中。可以通过pip工具完成这一过程,它会从Python软件包索引中下载Django的最新版本并安装到系统中[^2]。 ```bash pip install django ``` #### 2. 创建Django项目 创建一个新的Django项目有两种主要方式:一种是通过Django自带的命令行工具;另一种则是手动创建项目文件夹和配置文件。推荐初学者采用命令行工具的方式,因为它能自动生成标准的项目结构[^3]。 ```bash django-admin startproject mysite cd mysite ``` #### 3. 启动开发服务器 一旦项目被成功创建,就可以运行内置的开发服务器来测试环境是否正常工作。 ```bash python manage.py runserver ``` 访问 `http://localhost:8000/` 可以看到默认欢迎页面。 #### 4. 创建应用 Django中的每一个功能模块通常被称为“应用”。可以在项目下创建多个独立的应用程序,它们共享同一个数据库和其他资源。 ```bash python manage.py startapp polls ``` #### 5. 配置数据库 虽然在大多数情况下,SQLite会被用作默认数据库引擎,但如果希望切换至其他类型的数据库(如PostgreSQL),则需修改settings.py中的DATABASES字典项。值得注意的是,在定义模型时即使未显式声明主键字段,Django也会自动添加名为id的整型主键[^4]。 #### 6. 编写模型(Model) Models.py 文件专用于对数据库的操作。由于Django具备ORM(Object Relational Mapping),因此无需直接编写SQL语句即可完成增删改查等操作[^1]。 示例代码如下: ```python from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) ``` #### 7. 进行数据迁移 当更改了模型之后,必须执行迁移命令才能让这些变化反映到实际使用的数据库上。 ```bash python manage.py makemigrations python manage.py migrate ``` #### 8. 开发视图(Views)与路由(Urls) 视图负责处理请求并将响应返回给客户端。同时还需要设定好url路径与其对应的view之间的关系。 ```python from django.http import HttpResponse def index(request): return HttpResponse("Hello, world.") ``` 接着更新polls/urls.py: ```python from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ] ``` 最后记得把新建立好的应用加入到总项目的urls当中去。 #### 9. 利用模板Templates呈现网页内容 对于更复杂的HTML输出需求,则应该考虑利用Django Template Language(DTL)构建动态网站界面。 #### 10. 探索Admin后台管理站点 Django提供了一个非常方便的内容编辑平台——admin site,只需简单注册几个model就能立即获得一套完整的CRUD接口。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值