Django
打印sql日志
python
复制代码
from django.db import connection
print(connection.queries[-1])
# setting.py
DEBUG = True
LOG_LEVEL = os.environ.get("LOG_LEVEL", "DEBUG")
安装Django
cmd
复制代码
pip2.7 install django
# 注意,视频的django是3.4.1,现在使用pip3.9安装的是4.2
pip3.9 install django
pip3.9 uninstall django
pip3.9 install Django==3.2.9
/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin.py
/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin.pyc
/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin
创建Django项目
cmd
复制代码
cd /Users/jiayuchao/office/PycharmProjects/
/Library/Frameworks/Python.framework/Versions/3.9/bin/django-admin startproject TestDjango3915
默认目录结构介绍
cmd
复制代码
TestDjango
├── TestDjango
│ ├── __init__.py
│ ├── settings.py 【项目配置】 【常常修改】
│ ├── urls.py 【URL和函数的对应管理】 【常常修改】
│ └── wsgi.py 【同步 接收网络请求】【不要动】
│ └── asgi.py 【异步 接收网络请求】【不要动】
└── manage.py 【项目的管理,启动项目、创建app、数据管理】【不要动】
app【类似于JAVA的模块概念】
markdown
复制代码
- 项目
- app, 用户管理【表结构、函数、HTML模版、CSS】
- app, 订单管理【表结构、函数、HTML模版、CSS】
- app,后台管理【表结构、函数、HTML模版、CSS】
- app,网站【表结构、函数、HTML模版、CSS】
- app,API【表结构、函数、HTML模版、CSS】
- 创建app
python3.9 manage.py startapp app01
python3.9 manage.py startapp app02
app目录
复制代码
├── app01
│ ├── __init__.py
│ ├── admin.py 【固定,不用动】django默认提供的admin后台管理
│ ├── apps.py 【固定,不用动】 app启动类
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py 【重要】,对数据库操作
│ ├── tests.py 【固定,不用动】单元测试
│ └── views.py 【重要】,函数
app注册
markdown
复制代码
在settings.py中添加配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
编写URL和函数对应关系【urls】
python
复制代码
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/', views.index),
]
编写具体的函数
python
复制代码
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse('欢迎使用')
启动djiango项目
python
复制代码
python3.9 manage.py runserver
再写一个页面
python
复制代码
urlpatterns = [
# path('admin/', admin.site.urls),
path('index/', views.index),
path('user/list', views.user_list),
path('user/add', views.user_add),
]
templates模版
python
复制代码
def user_list(request):
return render(request,'user_list.html')
# 优先去根目录寻找(在配置了setting.py的dirs之后)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# 根据app注册顺序,在app目录下的templates查找user_list.html文件
静态文件
python
复制代码
{% load static %}
<html>
<head>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">
</head>
<h1>添加用户</h1>
<img src="/static/img/pic1.png"/>
<img src="{% static 'img/pic1.png' %}"/>
<input type="text" class="btn btn-primary" value="新建"/>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
</html>
├── static
│ ├── css
│ ├── img
│ │ └── pic1.png
│ ├── js
│ │ ├── jquery-3.6.0.js
│ │ └── jquery-3.6.0.min.js
│ └── plugins
│ └── bootstrap-3.4.1
│ ├── css
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.css.map
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap-theme.min.css.map
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ └── js
│ ├── bootstrap.js
│ ├── bootstrap.min.js
│ └── npm.js
模版语法python
python
复制代码
def tpl(request):
name = '超超11'
roles = ['admin', 'system', 'auditor']
user_info = {'name': '宇超', 'age': 18, 'role': 'admin'}
data_list = [
{'name': '郭智', 'age': 19, 'role': 'system'},
{'name': '卢慧', 'age': 20, 'role': 'auditor'},
{'name': '赵建先', 'age': 21, 'role': 'admin'},
]
dict_obj = {'n1': name, 'n2': roles, 'n3': user_info, 'n4': data_list}
return render(request, 'tpl.html', dict_obj)
模版语法HTML
python
复制代码
<html>
<div>{{ n1 }}</div>
<br/>
<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>{{ n2.2 }}</div>
<br/>
<div>{{ n3.name }}</div>
<div>{{ n3.age }}</div>
<div>{{ n3.role }}</div>
<br/>
<div>{{ n4.0.name }}</div>
<div>{{ n4.1.name }}</div>
<div>{{ n4.2.name }}</div>
<br/>
<div>
{% for item in n2 %}
<span>{{ item }}</span>
{% endfor %}
</div>
<br/>
<div>
{% for k,v in n3.items %}
<span>{{ k }}</span>
<span>{{ v }}</span>
<br/>
{% endfor %}
</div>
<div>
{% for item in n3.key %}
<span>{{ item }}</span>
<br/>
{% endfor %}
</div>
<div>
{% for item in n3.value %}
<span>{{ item }}</span>
<br/>
{% endfor %}
</div>
<br/>
<div>
{% for item in n4 %}
<span>{{ item.name }}</span>
<span>{{ item.age }}</span>
<span>{{ item.role }}</span>
<br/>
{% endfor %}
</div>
<div>
{% if n1 == '宇超' %}
11111
{% elif n1 == '超超' %}
22222
{% else %}
33333
{% endif %}
</div>
</html>
请求与响应
python
复制代码
pip3.9 install requests
def something(request):
# request是一个对象,封装了用户发送过来的所有的请求相关数据
# 请求方式 get/post
print(request.method)
# GET
# 在URL上传递的值 ?name=jiayuchao&age=18
print(request.GET)
# <QueryDict: {'name': ['jiayuchao'], 'age': ['18']}>
# return HttpResponse("返回内容")
# return render("返回内容","something.html")
return redirect("https://www.baidu.com/")
登录案例python
python
复制代码
def login(request):
if request.method == 'GET':
return render(request, "login.html")
print(request.POST)
name = request.POST.get('user')
password = request.POST.get('password')
print('name:%s,password:%s'%(name,password))
print(f'name:{{name}},password:{{password}}')
if name == 'jiayuchao' and password == '123':
return HttpResponse("登录成功!")
error_obj = {'error': '登录失败'}
return render(request, "login.html",error_obj)
登录案例html
html
复制代码
<html>
<title>登录</title>
<h1>用户登录</h1>
<form action="/login" method="post">
{% csrf_token %}
用户名:
<input type="text" name="user" placeholder="用户名"/>
<input type="text" name="password" placeholder="密码"/>
<input type="submit" placeholder="提交"/>
{{ error }}
</form>
</html>
数据库操作
markdown
复制代码
pip3.9 install pymysql
# Django有ORM框架
pip3.9 install mysqlclient
安装数据库
markdown
复制代码
# docker desktop 配置镜像加速器
{
"registry-mirrors": ["https://1n088knj.mirror.aliyuncs.com"]
}
# 下载镜像
docker pull mysql:5.7
# 运行镜像
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
# 本地mysql密码
password
root
# docker跑镜像
docker run -dit --name centos7.6 centos:7.6.1810 /bin/bash
安装数据库 brew install mysql@5.7
markdown
复制代码
# mac安装mysqlclient报错
1. 先安装mysql
brew install mysql@5.7
2. 再安装 pkg-config
brew install pkg-config
3. 配置环境变量(vi ~/.zshrc;source ~/.zshrc)
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"
export MYSQLCLIENT_CFLAGS=$(mysql_config --cflags)
export MYSQLCLIENT_LDFLAGS=$(mysql_config --libs)
# brew查看服务状态
brew services list
brew services start mysql@5.7
brew services stop mysql@5.7
# 创建数据库
create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database vulscan DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database galaxy_vulscan_i18n DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
ALTER DATABASE galaxy_vulscan_i18 RENAME TO galaxy_vulscan_i18n;
python
复制代码
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "gx_day15",
"USER": "root",
"PASSWORD": "root",
"HOST": "127.0.0.1",
"PORT": "3306",
}
}
Django操作表
创建表
python
复制代码
#在models.py书写
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField
"""
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32)
password varchar(64)
age int
)
"""
# 先安装mysqlclient
pip3.9 install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3.9 install mysqlclient
# 改变了你的models.py文件后,创建新的迁移文件。这个命令会检查你的模型定义和当前的数据库结构,然后创建一份用于更新数据库以匹配模型的迁移文件。
python3.9 manage.py makemigrations
# 迁移文件到数据库的命令,这样数据库就可以进行必要的更新以匹配模型的当前状态。
python3.9 manage.py migrate
python2.7 manage.py makemigrations
# 迁移文件到数据库的命令,这样数据库就可以进行必要的更新以匹配模型的当前状态。
python2.7 manage.py migrate
新增表
python
复制代码
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField
class Department(models.Model):
title = models.CharField(max_length=16)
python3.9 manage.py makemigrations
python3.9 manage.py migrate
删除表
python
复制代码
# class Department(models.Model):
# title = models.CharField(max_length=16)
# year = models.CharField(max_length=16, default=0)
python3.9 manage.py makemigrations
python3.9 manage.py migrate
修改表
python
复制代码
# 加入了year字段
class Department(models.Model):
title = models.CharField(max_length=16)
year = models.CharField(max_length=16)
# 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
# 2) Quit, and let me add a default in models.py
选择1给默认值,或者2退出
# 或者加字段的时候直接给默认值,推荐
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField
# 已有数据默认值为2,不是字段默认值2
size = models.IntegerField(default=2)
# 可以为Null
data = models.IntegerField(null=True, blank=True)
class Department(models.Model):
title = models.CharField(max_length=16)
year = models.CharField(max_length=16, default=0)
增删改查数据
增
python
复制代码
class Department(models.Model):
title = models.CharField(max_length=16)
objects = models.Manager()
Department.objects.create(title='销售部')
列表
python
复制代码
def department_list(request):
query_set = Department.objects.all()
for item in query_set:
print(item.id,item.title)
return HttpResponse("列表成功")
单查
python
复制代码
def department_one(request):
item = Department.objects.filter(id='1').first()
print(item.id, item.title)
return HttpResponse("单个查询成功")
改
python
复制代码
def department_update(request):
Department.objects.all().update(title='1234')
return HttpResponse("更新成功")
def department_update_one(request):
Department.objects.filter(id='4').update(title='1234')
return HttpResponse("更新成功")
删
python
复制代码
def department_delete(request):
# Department.objects.filter(id='1').delete()
Department.objects.all().delete()
return HttpResponse("删除成功")
Resultful语法删除
python
复制代码
path('department/<int:nid>/delete', views.department_delete_one),
def department_delete_one(request, nid):
Department.objects.filter(id=nid).delete()
return HttpResponse("删除成功")
http://127.0.0.1:9000/department/6/delete
外键
python
复制代码
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField
# 自动生成depart_id的外键 to关联表 to_field关联字段
# CASCADE自动删除
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE,default='4')
objects = models.Manager()
模版继承
母版
python
复制代码
{% load static %}
<html>
<head>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">
{% block css %}{% endblock %}
</head>
<div>
{% block content %}{% endblock %}
</div>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
{% block js %}{% endblock %}
</html>
继承母版
python
复制代码
{% extends 'layout.html' %}
{% block css %}
<style>
.btn{
fond-size:20px;
}
</style>
{% endblock %}
{% block content %}
<h1>添加用户</h1>
<img src="/static/img/pic1.png"/>
<input type="text" class="btn btn-primary" value="新建"/>
{% endblock %}
{% block js %}
<h1>底部位置</h1>
{% endblock %}