python:django项目知识点01——前期配置、用户管理、权限核验、django-orm

前言

        在我一直以来就认为,相比java spring,django“只”适合搭建一个较小的业务系统、或者功能页面。
        并且,目前我做的最多的就是:基于三方鉴权的功能性交互页面、一些展示页面、和较小体量的功能系统(也是可以满足一套基本需求的)。
        总体而言,它的优势在于:其凭借python胶水代码特性,能够迅速开发并实现扩展性高、功能小巧的的业务系统或功能页面。

知识点

        模块安装 

pip install Django
pip install django-cors-headers
pip install PyMySQL
pip install djangorestframework

 

        配置settings.py 

...
# 是否以测试环境运行
# 生产环境请更换为True
DEBUG = False# 访问许可,这里*表示接收一切形式的host访问
# 如果你更换为某个域名,将只允许第三方通过该域名访问本系统
ALLOWED_HOSTS = ['*']# Application definition
# 辅助系统自动识别应用程序,例如INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','corsheaders',  # 添加:跨域组件'StaicDjangoDemo',
]# 中间件配置
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',  # 跨域中间件,放首行(放其他行未测试)'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware', # 防止跨站请求伪造 (CSRF) 攻击,有些情况会过敏,我不太喜欢这个'django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]# 配置数据库连接,这里用的是mysql
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'database','USER': 'root','PASSWORD': 'xxxxxxx','HOST': '127.0.0.1','PORT': '3306','OPTIONS': {'charset': 'utf8mb4',},}
}# # 日志
# LOGGING = {
#     'version': 1,
#     'disable_existing_loggers': False,
#     'handlers': {
#         'file': {
#             'level': 'ERROR',
#             'class': 'logging.FileHandler',
#             'filename': 'errors.log',
#             'formatter': 'verbose',
#         },
#     },
#     'formatters': {
#         'verbose': {
#             'format': '%(asctime)s [%(levelname)s] %(message)s',
#             'datefmt': '%Y-%m-%d %H:%M:%S',
#         },
#     },
#     'loggers': {
#         'django': {
#             'handlers': ['file'],
#             'level': 'ERROR',
#             'propagate': True,
#         },
#     },
# }# 系统时间,这里选用上海时间
TIME_ZONE = 'Asia/Shanghai'# session设置,存储到database里
SESSION_ENGINE = 'django.contrib.sessions.backends.db'# 设置每个用户的最大Session数量
MAX_SESSION_PER_USER = 5
# 设置session在浏览器关闭时失效
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
# 设置Session的衰减时间为一天
SESSION_COOKIE_AGE = 86400  # 一天的秒数# 用户登出跳转的地址
LOGOUT_REDIRECT_URL = '/login'  # 用户登出后重定向到登录页面# 设置静态文件目录,生产环境建议使用nginx来开放静态文件目录
# 使用【python manage.py collectstatic】指令,将可以把STATICFILES_DIRS内所有的静态文件汇总到STATIC_ROOT中
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), r'C:\Users\HP\Pictures'
)
STATIC_ROOT = 'staticfiles'# 跨域忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = ()
# 对应的发送的请求的跨域
CORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW',
)CORS_ALLOW_HEADERS = ('accept','accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with',
)

 

数据库迁移 

        需要在settings.py同级目录的__init__.py中添加如下代码,使用pymysql来为django提供mysql数据库服务

import pymysql
pymysql.install_as_MySQLdb()

        django系统表迁移至数据库:
利用迁移文件(全量)迁移到数据库:python manage.py migrate
只生成迁移session数据表:python manage.py migrate sessions
只生成迁移auth系统用户数据表:python manage.py migrate auth
根据数据库生成django-orm模型:python manage.py inspectdb > models.py 

 

 用户管理

        至少将session和auth相关数据表迁移到数据库后,你需要以下脚本来管理用户

        这个脚本需要在项目根目录下运行 

import os
import django# 设置 Django 项目的环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myDemo.settings")
django.setup()from django.contrib.auth.models import Userdef create_user(username, email, password):# 检查用户是否已经存在if User.objects.filter(username=username).exists():print(f"用户 '{username}' 已经存在")return# 创建新用户User.objects.create_user(username=username, email=email, password=password)print(f"用户 '{username}' 创建成功")def update_user_password(username, old, new):# 检查用户是否已经存在user = User.objects.get(username=username)if user:# 验证旧密码if user.check_password(old):# 旧密码正确,设置新密码user.set_password(new)user.save()print(f"Password for user '{username}' changed successfully.")else:print("Old password is incorrect.")else:print('username not found')def delete_user(username):# 查找用户try:user = User.objects.get(username=username)user.delete()print(f"User '{username}' deleted successfully.")except User.DoesNotExist:print(f"User '{username}' does not exist.")# 查询用户的所有信息(密文密码)
def check_users():users = User.objects.all()for user in users:print(f"Username: {user.username}, Email: {user.email}, Password: {user.password}")if __name__ == "__main__":# 替换为你想要创建的用户信息# username = "test"# email = "xxx@qq.com"# password = "username"# new_password = 'qnetKPHJ'# create_user(username, email, password)# update_user_password(username, password, new_password)# delete_user('xu')check_users()

 

        配置路由urls.py

from django.urls import path, re_path
from django.views import static as sta  # 新增
from .page.public import success
from .page import room, app, user, welcome
from .api import api_app
from django.contrib.auth import views as auth_viewsurlpatterns = [# 强制开放静态资源,即使在debug为False的情况下,不推荐re_path(r'^static/(?P<path>.*)$', sta.serve,{'document_root': 'static'}, name='static'),# 系统自定义路由,服务页面path('welcome', welcome.welcome),path('success/room_add', success.success_room_add),path('success/app_add', success.success_app_add),path('success/register', success.success_register_add),path('room/add', room.add_room),path('app/add', app.add_app),path('app/list', app.app_list),path('register/', user.register, name='register'),path('login/', user.login_view, name='login'),# 用户登出,系统自带服务,登出后跳转至setting.py中的LOGOUT_REDIRECT_URL指定urlpath('logout/', auth_views.LogoutView.as_view(), name='logout'),# 这里是restframework api的路由path('api/app/list', api_app.AppListView.as_view()),path('api/app/list/state', api_app.AppStateFilterView.as_view()),path('api/app/detail', api_app.AppAppidFilterView.as_view()),
]

         用户权限核验

        登录与登出

from django.contrib.auth import authenticate, login, logout# 登录鉴权验证
user = authenticate(request, username=username, password=password)
if user:# 赋予用户授权login(request, user)# 解除用户授权(登出)
logout(request)

        身份核验功能

if request.user.is_authenticated:# 获取访问者用户名username = request.user.username

 

        Django-orm 

         我比较讨厌规定规格的django-orm,并更喜欢原生sql,但这里还是给出orm的一些操作

        模型示例

# 在 myapp/models.py 中
from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)published_date = models.DateField()isbn = models.CharField(max_length=13, unique=True)def __str__(self):return self.title

         增

# 使用 .create() 方法
Book.objects.create(title="Django for Beginners",author="William S. Vincent",published_date="2024-01-01",isbn="978-0-1234-5678-9"
)# 或者先创建实例再保存
book = Book(title="Django for Experts",author="John Doe",published_date="2024-02-01",isbn="978-1-2345-6789-0"
)
book.save()

         查

# 获取所有 Book 实例
all_books = Book.objects.all()# 根据条件获取 Book 实例
book_by_title = Book.objects.get(title="Django for Beginners")# 使用 .filter() 方法
books_by_author = Book.objects.filter(author="William S. Vincent")# 获取前两个 Book 实例
first_two_books = Book.objects.all()[:2]# 使用 .exists() 检查某个条件是否存在
exists = Book.objects.filter(title="Django for Beginners").exists()

        改 

# 获取要更新的 Book 实例
book = Book.objects.get(title="Django for Beginners")# 修改字段
book.published_date = "2024-01-15"
book.save()

        删

# 获取要删除的 Book 实例
book = Book.objects.get(title="Django for Beginners")# 删除实例
book.delete()# 或者批量删除符合条件的实例
Book.objects.filter(author="John Doe").delete()

         自定义sql查询

        实用于复杂的查询功能 

from django.db import connectiondef raw_sql_select(sql, input):with connection.cursor() as cursor:cursor.execute(sql, input)# 获取字段名称columns = [col[0] for col in cursor.description]# 获取所有行rows = cursor.fetchall()# 将结果转换为字典列表results = [dict(zip(columns, row)) for row in rows]return results# 查询执行进程
processes = raw_sql_select("""
SELECT e.dict_value as state, c.result as res_text, c.appendix as appendix,date_format(c.end_time, '%%Y-%%m-%%d %%H:%%i') as process_time
FROM tb_task_process c
JOIN tb_dict e ON c.state = e.dict_id AND e.dict_type = 'process_state'
WHERE c.order_id = %s 
""", [order_id])
print(processes)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427513.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【machine learning-七-线性回归之成本函数】

监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b&#xff0c;使成本函数值最小化&#xff1f; 在线性回归中&#xff0c;我们说到评估模型训练中好坏的一个方法&#xff0c;是用成本函数来衡量&#xff0c;下面来详细介绍一下 成本函数…

IPv6路由基础

RIPng RIPng是一种较为简单的内部网关协议&#xff0c;是RIP在IPv6网络中的应用。RIPng主要用于规模较小的网络中&#xff0c;比如校园网以及结构较简单的地区性网络。由于RIPng的实现较为简单&#xff0c;在配置和维护管理方面也远比OSPFv3和IS-IS for IPv6容易&#xff0c;因…

黑马头条APP手工测试项目

1.app有关概念 APP测试范围&#xff1a; 业务功能测试 专项测试&#xff1a;兼容性测试 、安装/卸载/升级测试、交叉事件测试 、push消息推送测试、性能测试、其他测试&#xff08;用户体验、权限/边界、权限&#xff09; 功能测试测试对象&#xff1a; 功能点&#xff08;单…

JAVA虚拟机----JVM

(一)认识JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 &#xff08;二&#xff09;JVM运…

EmguCV学习笔记 C# 12.3 OCR

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

EmguCV学习笔记 C# 12.2 WeChatQRCode

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

【Android】Handler用法及原理解析

文章目录 用处基本用法用法一&#xff1a;使用sendMessage和handleMessage方法用法二&#xff1a;使用post方法 法一工作原理Handler的sendMessageMessage成员变量 MessageQueueLooper主线程自动初始化子线程手动创建prepareloop Handler的dispatchMessage 法二工作原理Handler…

electron多标签页模式更像客户端

Electron多标签页模式是指在Electron框架中实现的类似Web浏览器的多标签页功能。Electron是一个使用Web技术&#xff08;HTML、CSS和JavaScript&#xff09;来创建跨平台桌面应用程序的框架。在Electron中实现多标签页模式&#xff0c;通常需要借助一些特定的库或组件&#xff…

PMP--二模--解题--11-20

文章目录 14.敏捷--实践--每日站会--团队成员利用每日站会对彼此做出小的承诺&#xff0c;发现问题&#xff0c;并确保团队工作顺利进行。&#xff08;不是项目经理说&#xff0c;是团队成员&#xff09;11、 [单选] 在每日站会上&#xff0c;项目经理与团队成员逐个交流&#…

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…

口哨声、歌声、boing声和biotwang声:用AI识别鲸鱼叫声

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

web基础—dvwa靶场(八)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第五集:再制作更多的敌人

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作敌人另个爬虫Crawler 1.公式化导入制作另个爬虫Crawler素材2.制作另个爬虫Crawler的Crawler.cs状态机3.制作敌人另个爬虫Crawler的playmaker状态机二、…

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…

DNS服务

一.DNS介绍 DNS应用层协议 Domain Name System 域名系统 作用&#xff1a;实现域名解析&#xff0c;解析主机名所对应的IP地址&#xff0c; 在网络环境中设备与设备之间要想相互通信只能依赖IP地址&#xff0c;DNS服务器的作用是实现域名解析。 如上图所示&#xff0c;DNS存…

英飞凌 PSoC6 RT-Thread 评估板简介

概述 2023年&#xff0c;英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布了一款 PSoC™ 62 with CAPSENSE™ evaluation kit 开发板 &#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;&#xff0c;该开发套件默认内置 RT-Thread 物联网操作系统。PSoC 6 RTT 开…

Matplotlib | 一文搞定Matplotlib从入门到实战演练!

文章目录 1 什么是Matplotlib1.1 Matplotlib的安装1.2 Matplotlib的基本使用 2 绘制直线3 绘制折线设置标签文字和线条粗细设置中文标题风格的设置 4 绘制曲线绘制曲线yx^2绘制正弦曲线和余弦曲线画布分区 5 绘制散点图绘制不同种类不同颜色的线 6 绘制条形图&#xff08;柱状&…

计算机网络 ---- OSI参考模型TCP/IP模型

目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

【Django5】django的helloworld

安装django pip install djangoDjango官方中文文档 https://docs.djangoproject.com/zh-hans/5.1/Github链接 https://github.com/django/django创建Django项目 cd到想要创建项目的文件夹下&#xff0c;输入以下命令创建项目 这行代码将会在当前目录下创建一个 mysite 目录 …