django入门

推荐官方文档
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.csdn.net/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("登录页面"))
————————————————
版权声明:本文为CSDN博主「忘记以前」的原创文章,遵循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会等待所有线程的退出。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值