前后端不分离:template, 前后端分离:drf
admin.py 是给后台管理用的,views.py 是给前端调用的。
1 新建Django项目
cmd 命令:
django-admin startproject 工程名称
新建Django项目_django 新建项目_星_奕的博客-CSDN博客
2 运行项目 ctrl +f5
1 命令启动: python manage.py runserver
2 pycharm 启动配置
3 创建应用 (模块)
(一个项目可以包括多个应用,一个应用可被多个项目包含)
python manage.py startapp 应用名
4 安装django-cors-headers 实现cors
安装django-cors-headers插件:
- pip install django-cors-headers
5 添加应用
在settings.py 列表INSTALLED_APPS 里添加应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 跨域访问
'corsheaders',
'firstApp', # 新建的应用
]
复制创建应用
如果已经有了应用,直接复制一份应用文件夹,
1 修改包名。在settings.py 列表INSTALLED_APPS 里添加新应用。在urls.py添加路由。
2 修改apps.py
3修改__init__.py 文件
4 修改models.py,views.py ……
启动项目
python manage.py runserver ip:端口
或:
python manage.py runserver
创建模板文件
应用目录下创建templates文件夹,文件夹下创建thml文件
views.py 的方法 转换html文件
from django.shortcuts import render
# Create your views here.
def home(request):
return render(request,"index.html")
路由导入
urls.py
from django.contrib import admin
from django.urls import path
from firstApp.views import home
urlpatterns = [
path('admin/', admin.site.urls),
path('',home,name= 'home'), # 自己的路由
]
目录结构
把模式映射到数据库里(数据迁移 建表)
python manage.py makemigrations
python manage.py migrate
Django 框架:操作mysql数据库_django映射mysql_南风和云的博客-CSDN博客
创建管理员
python manage.py createsuperuser
路由访问路径
httpurl->urls.py -> views.py->html文件
django shell
Django Shell 是一个命令行工具,可以在其中运行 Django 代码。可以通过以下步骤在 Django Shell 中启动一个 Python 解释器:
-
打开命令行终端。
-
进入 Django 项目的根目录。
-
运行
python manage.py shell
命令。
这会启动 Django Shell 并显示一个 Python 解释器的提示符。在这个提示符下,您可以执行 Django 相关的代码。
以下是一个 Django Shell 的示例会话:
>>> python manage.py shell
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Django 3.1.6
Type 'help' for help.
from django.contrib.auth.models import User
>>>
User
>>> my_objects =
.objects.all()
>>> for obj in my_objects:
... print(obj.name)
...
John
Alice
Bob
>>> u= User()
>>>u.password = 'zhangsan'
>>>u.username ='zhangsan'
>>>u.save()
>>> eixt
Django对于MySQL数据库操作
#下面语句会翻译成
insert into app01_userinfo.......
#增加
UserInfo.objects.create(name='张三', password='1001', age='21')
#删除
UserInfo.objects.filter(id=3).delete()
#删除
UserInfo.objects.all().delete()
#获取数据
UserInfo.objects.all() #得到是列表(queryset类型)
data_list = UserInfo.objects.all()
for item in data_list:
item.id,item.name,item.password,item.age
UserInfo.objects.filter(id=3).first() #取queryset得第一行
#更新数据
UserInfo.objects.all().update(password='1002')
#更新数据
UserInfo.objects.filter(id='2').update(password='1002')
age = models.IntegerField(null = true) #允许默认值为空。
age = models.IntegerField(defalut = 2) #默认值为2。
断点调试
Django项目的调试_django 打断点调试_hhhhhh-1的博客-CSDN博客
自动生成 requirements 的两种方法
那我们要如何自动生成 requirements.txt 文件,其实有两种方法
第一种 适用于 单虚拟环境的情况:
pip freeze > requirements.txt
为什么只适用于单虚拟环境?因为这种方式,会将环境中的依赖包全都加入,如果使用的全局环境,则下载的所有包都会在里面,不管是不时当前项目依赖的
当然这种情况并不是我们想要的,当我们使用的是全局环境时,可以使用第二种方法。
第二种方法
第二种 (推荐) 使用 pipreqs ,github 地址为: github.com/bndr/pipreqs
** 安装**
pip install pipreqs
在当前目录生成
pipreqs . --encoding=utf8--force
注意 --encoding=utf8 为使用 utf8 编码,不然可能会报
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xae in position 406: illegal multibyte sequence 的错误。
--force 强制执行,当 生成目录下的 requirements.txt 存在时覆盖。
拉取运行项目
1,pycharm 打开项目
2,创建虚拟环境
3,安装依赖
pip install -r requirements.txt
4,启动项目
python manage.py runserver 8000
Django事务装饰器
- @transaction.atomic:将一个数据库事务限定在一段代码内。如果在事务块内出现异常,Django 会自动回滚事务。如果没有异常,Django 会自动提交事务。
- @transaction.non_atomic_requests:在视图函数或类视图上使用,表示在该视图函数或类视图中不使用事务。
- @transaction.commit_manually:在事务块内使用,表示在事务块内如果没有出现异常,需要手动调用 transaction.commit() 来提交事务。
- @transaction.rollback:在事务块内使用,表示在事务块内如果出现异常,需要手动调用 transaction.rollback() 来回滚事务。
信号触发器
from django.dispatch import receiver
class Resume(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
email = models.EmailField(max_length=30, verbose_name='邮箱')
position = models.CharField(max_length=40, verbose_name='申请职位')
grade_list = (
(1, '未审'),
(2, '通过'),
(3, '未通过'),
)
status = models.IntegerField(choices=grade_list,
def __str__(self):
return self.name
class Meta:
verbose_name = '简历'
verbose_name_plural = '简历'
ordering = ('-status', '-publishDate')
@receiver(post_init, sender=Resume)
def before_save_resume(sender, instance, **kwargs):
instance.__original_status = instance.status
# 信号触发器 监控模型Resume的属性status 是否从1更新为2
@receiver(post_save, sender=Resume)
def post_save_resume(sender, instance, **kwargs):
email = instance.email # 应聘者邮箱
EMAIL_FROM = 'daizikui@qq.com' # 企业QQ邮箱
if instance.__original_status == 1 and instance.status == 2:
print('信号触发器执行成功')
# 自己的业务
接口缓存
1,使用数据库表当缓存
建缓存表
python manage.py createcachetable cache_table_home
配置缓存 setting.py
#配置缓存表
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 缓存类型
'LOCATION': 'cache_table_home',
'TIMEOUT': 600, # 超时时间 秒
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}
接口使用缓存
from django.views.decorators.cache import cache_page
# Create your views here.
@cache_page(60 * 15) # 单位:秒数,这里指缓存 15 分钟
def home(request):
# 新闻展报
newList = MyNew.objects.all().filter(~Q(
newType='通知公告')).order_by('-publishDate')
postList = set()
postNum = 0
for s in newList:
if s.photo:
postList.add(s)
postNum += 1
if postNum == 3: # 只截取最近的3个展报
break
# 新闻列表
if (len(newList) > 7):
newList = newList[0:7]
# 返回结果
return render(request, 'home.html', {
'active_menu': 'home',
'postList': postList,
'newList': newList,
})
2,使用redis缓存
pip install django-redis
# setting.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://ip:6379', # redis所在服务器ip地址
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "pwd", # redis密码,没有就注释掉
},
},
}
django admin管理后台
1,重写后台页面
admin.py
@admin.register(C)
class CAdmin(admin.ModelAdmin):
list_display = ['id','name','cities','counties']
list_display_links = ['name']
search_fields = ['name']
# list_select_related = [] # 可以多级关联 只能正关联,不能反关联,
# add_form_template = 'add_template.html' # 方法1 这种方式只能只能修改页面样式,不能传递参数
# 方法2 这种方式既可以修改默认页面,也可传递参数
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path('<int:object_id>/change/', self.admin_site.admin_view(self.custom_view), name=urls[4].name)
]
urls[4] = custom_urls[0]
return urls
def custom_view(self, request, object_id):
obj = self.model.objects.get(id=object_id)
return render(request, 'mytemplate.html',
{'model_instance': obj})
mytemplate.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id='newApp'>
<p>id: {{model_instance.id}}</p>
<p>name: {{model_instance.name}}</p>
</div>
</body>
</html>
<script>
</script>
2,后台接口
simpleui 快速上手指南
simpleui 快速上手指南_simple ui_暖阳python的博客-CSDN博客