Django 基础配置2

进入虚拟环境

worken name

创建项目

django-admin startproject mysite 

下载pip

挂梯子
pip install pillow -i https://pypi.python.org/simple

Django Mysql

建一个utf8的数据库
create database script  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
链接数据库
jdbc:mysql://localhost:3306/DjangoCache2?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

数据库地址

C:\ProgramData\MySQL\MySQL Server 8.0\Data

数据库文件的迁移

1. mysqldump -uroot -p123456  djangocache2> test.sql  将数据库导出成sql文件
 https://www.runoob.com/mysql/mysql-database-export.html

将SQL文件导入MySql

1.create database test;
2. use test
3.source c:   path    将生成的sql 文件重新导成数据库文件

配置setting

"""
Django settings for DjangoModel project.

Generated by 'django-admin startproject' using Django 3.0.3.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'r!5&+zz!+po%ni!cq!!f@ps#osgpdy5^u95&zxwqde*^4_j^g#'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 注释掉使用POST表单
    # 防跨站攻击
   # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # 中间键的注册
    # 'middleware.LearnMiddle.HelloMiddle',
]

ROOT_URLCONF = 'DjangoModel.urls'

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',
            ],
        },
    },
]

WSGI_APPLICATION = 'DjangoModel.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'HOST' :'127.0.0.1',
        'PORT' : '3306',
        'NAME' :'DjangoModel',
        'USER' :'root',
        'PASSWORD':'123456',

    }
}


# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True
#不使用系统时区
USE_TZ = False 


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

查看电脑IP

ipconfig

配置让局域网内机器访问

python manage.py runserver 0.0.0.0:8000

配置静态资源

STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static')
]

控制url后是否加上 “/”

APPEND_SLASH = False

MEDIA_ROOT媒体根目录(文件上传时使用)

MEDIA_ROOT=os.path.join(BASE_DIR,'static/upload')

Models加入外键

 s_grade = models.ForeignKey(Grade, on_delete=models.CASCADE)

csrf防跨站攻击

  • 可以不注释setting中的 django.middleware.csrf.CsrfViewMiddleware
  • 在post表单验证时加上
{% csrf_token %}

locals()

  • 内置函数
  • 将局部变量以字典的形式打包
  • key是变量名value 是数据

Url反向解析

  • 配置项目中的根urls
 url(r'App/',include(('App.urls','App'),namespace='App')),
  • 不含参数
 url('Two/', include(('Two.urls', 'second'), namespace='second')),
 url(r'^lean/',views.lean,name='lean')
 def lean(request):
    return HttpResponse('Love Lean')
<a href="{% url 'second:lean' %}">Go Lean</a>
  • 含位置参数
<a href="{% url 'second:get_time' 15 38 42%}">Time Time</a>
<a href="{% url 'namespace:name' value1 value2 value3 %}">Data</a>
  • 含关键字参数
# (?P\d+)
# (?P\d+)
# (?P\d+)
url(r'^GetData/(?P\d+)/(?P\d+)/(?P\d+)',views.get_data)
def get_data(request, day, mouth, year):
    return HttpResponse(f'今天时{year}{mouth}{day}日')
<a href="{% url 'second(namespace):data(name)' day=26 mouth=5 year=2020 %}">Data</a>
<a href="{% url 'namespace:name' key1=value1 %}">Data</a>

错误页面定制

  • 在templates中重写404.html
  • 关闭Debug

获得request中get的参数

  • http://127.0.0.1:8000/Two/HaveRequest/?hobby=eat&hobby=game
print(request.GET)
#
hobbys=request.GET.getlist('hobby')
print(hobbys)
#['eat', 'game']
hobby=request.GET.get('hobby')
#只获得最后一个参数
#game

Method请求方法

  • GET
  • POST

response属性和方法

  • content 内容
  • encoding 编码类型
  • status_code 状态码
  • content_type 传输数据类型的打开方式
    • MIME 互联网邮件扩展类型
    • 标记浏览器以什么形式打开文件内容
    • 大类型/小类型
  • write
  • flush

META

  • 源信息
  • 包含客户端的各种数据
ip = request.META.get('REMOTE_ADDR')

响应重定向

def get_ticket(request):
    url=reverse('App:hello')   # namespace:name
    return HttpResponseRedirect(url)
	# return HttpResponseRedirect('/App/hello/')
def get_ticket(request):
    return redirect(reverse('App:hello'))

reverse含有参数

  • 位置参数
reverse('namespace:name',args=(value1,value2,))
  • 关键字参数
reverse('namespace:name',kwargs={ky1:value1,key2:value2})

状态码

  • 301

    • 永久重定向
  • 302

    • 临时重定向
  • 400

    • 不好的错误的一个请求
  • 403

    • 没有权限访问
  • 404

    • 没找见
  • 405

    • 请求方法不被支持
  • 500

    • 服务器内部错误

返回JSON数据

def get_info(request):
    data={
        'status':200,
        'msg':'ok',
    }
    return JsonResponse(data=data)

汉字进行编码

  • urllib
# 编码
uname = parse.quote(request.POST.get('uname'))
# 解码
uname = parse.unquote(request.COOKIES.get('uname'))
  • base64

对COOKIE进行加密解密

  • 加密解密使用同一个密钥(salt)

  • 加密

# 'test'为加密解密所需要的密钥
response.set_signed_cookie('content',uname,'test')
  • 解密
uname=request.get_signed_cookie('content',salt='test')

session和cookie的删除

  • 删除cookie
# 数据库中的数据未删除
response.delete_cookie('sessionid')
  • 删除session
# 数据库中的数据未删除
del request.session['username']
  • session和cookie一起删除
# 数据库中的数据也被删除
request.session.flush()

重新迁移文件

  • 删除迁移文件
  • 删除迁移文件产生的表
  • 删除迁移记录(django_migrations)

模型关系

  • 一对一
    • 用于复杂表的拆分
    • 用于扩展新功能
# 加入外键 on_delete=models.CASCADE
# null=True 可不可以为空
id_person = models.OneToOneField(Person, on_delete=models.CASCADE, null=True, blank=True)
  • 一对多
    • 主获取从,隐性属性,级联模型_set
    • 从获取主,显性属性
# 加入外键 on_delete
id_person = models.ForeignKey()
  • 多对多
class Customer(models.Model):
    c_name = models.CharField(max_length=16)
class Goods(models.Model):
    g_name = models.CharField(max_length=16)
    g_customer = models.ManyToManyField(Customer)
    
  • 级联数据
    • add
    • remove
    • clear
    • set
  • ManyRelatedManager
    • 函数中定义的类
    • 父类是一个参数
    • 动态创建

数据库级联表数据的删除

  • 级联表
    • 主表
    • 从表
    • 谁声明关系就是从表
# Per
class Person(models.Model):
    p_name = models.CharField(max_length=16, db_column='name')
    # True 为男性
    p_sex = models.BooleanField(default=True)
class IDCard(models.Model):
    id_number = models.IntegerField(max_length=18, unique=True)
    id_person = models.OneToOneField(Person, on_delete=models.CASCADE, null=True, blank=True)

  • on_delete 在删除数级联的数据如何处理

  • 默认特性CASCADE

    #参数 on_delete=models.CASCADE
    
    • 从表数据删除,主表数据不受影响
    • 主表数据删除,从表数据直接删除
  • PROTECT受保护的

    • 开发中防止误操作,设置此模式
    • 主表如果存在级联数据,删除动作受保护,不能删除成功
    • 主表如果不从在级联数据,可以删除成功
    # 参数 on_delete=models.PROTECT
    
  • SET_NULL(前提允许为NULL)

# 将主表中的name被删除后从表级联的id_person_id成为 null
id_person = models.OneToOneField(Person, on_delete=models.SET_NULL, null=True, blank=True)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4EwykBr-1640748463636)(./png/Django1.png)]

  • SET_DEFAULT (存在默认值)

  • SET(指定值)

级联数据获取

  • App/models.py
from django.db import models
class Person(models.Model):
    # 主表
    p_name = models.CharField(max_length=16, db_column='name')
    # True 为男性
    p_sex = models.BooleanField(default=True)
class IDCard(models.Model):
    # 从表
    id_number = models.IntegerField(max_length=16, unique=True)
    id_person = models.OneToOneField(Person, null=True, blank=True, on_delete=models.SET_NULL)
  • 从获取主
  • 从获取主显性属性 ,就是属性的名字
def get_person(request):
    idcard = IDCard.objects.last()
    person = idcard.id_person
    return HttpResponse(f'{person.p_name}')
  • 主获取从
  • 主获取从,隐性属性,默认就是级联模型的名字
# idcard 为隐性属性名
def get_idcard(request):
    person = Person.objects.last()
    idcard = person.idcard
    return HttpResponse(f'{idcard.id_number}')

模型继承

  • 默认继承是将通用字段放到父表中,特定字段放到自己的表中,中间使用外键联接

    • 关系型数据库,关系越乱,效率越低
    • 父类中会储存大量的信息
  • 使用元信息来解决这个问题

    • 增加abstract = True
    • 使模型抽象化
    • 抽象的模型在数据库中就不产生映射了
    • 子模型映射出来的表直接包含模型的字段
class Animal(models.Model):
    a_name = models.CharField(max_length=16)
    class Meta:
        # 只创建Cat和Dog两张表
        # 如果不加 创建三张表 如果主表数据量大将影响数据的查询速度
        abstract = True
class Cat(Animal):
    c_eat = models.CharField(max_length=32)
class Dog(Animal):
    d_lags = models.IntegerField(default=4)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjnATMrr-1640748463637)(.\png\Django2.png)]

model模型反向生成(sql–>model)

  • 命令
python manage.py inspectdb
将用命令生成的python代码拷贝到App的models中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtcgrMob-1640748463638)(.\png\Django3.png)]

  • 或者直接删除models将代码重定向到目标models文件中
python manage.py inspectdb > App/models.py
  • 元信息中包含一个属性managed=False

  • 如果自己的模型不想被迁移系统管理可增加属性managed=False

由用户传入文件服务器接收文件

def upload_file(request):
    if request.method=='GET':
        return render(request,'upload.html')
    elif request.method=='POST':
        icon=request.FILES.get('icon')
        print(icon)
        print(type(icon))
        with open(r'D:\my_projects\SqlToModel\static\img\icon.png','wb') as file:
            for part in icon.chunks():  
                file.write(part)
                file.flush()
        return HttpResponse('Files upload Success!')
@ file name: image_field.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传title>
head>
<body>
<form action="{% url 'app:upload_file' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <span>文件: span>
    <input type="file" name="icon">
    <br>
    <input type="submit" value="上传">
form>
body>
html>
class UserModel(models.Model):
    u_name = models.CharField(max_length=16)
    # upload_to 相对路径 相对于的是MEDIA_ROOT 媒体根目录
    u_icon = models.ImageField(upload_to='%Y/icons')


def image_field(request):
    if request.method == 'GET':
        return render(request, 'image_field.html')
    elif request.method == 'POST':
        username = request.POST.get('username')
        icon = request.FILES.get('icon')
        user = UserModel()
        user.u_name = username
        user.u_icon = icon
        user.save()
        return HttpResponse('upload Success!')

继承HTML 并在其中加入static

{% extends 'base.html' %}
{% load static %}


{% block rander %}
    <h1>testh1>
{% endblock %}


{% block link_css %}
{#    只是开发者可用#}
    
{% endblock %}

你可能感兴趣的:(Python,django,mysql,python)