推荐官方文档
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
会等待所有线程的退出。
暂时的解决:缩短休眠时长。