Django三板斧,Django连接数据库

放肆的年华 提交于 2019-12-01 21:37:24

目  录

  • 知识回顾总结

  • Django小白三板斧

  • 静态文件配置

  • form表单提交post请求中间件问题

  • request对象及其方法

  • pycharm连接数据库、Django连接数据库

  • Django ORM 简介

  • 字段、数据的增删改查

 

 

前言思路:

   本文介绍完HttpReseponse,render,redirect    小白三板斧之后,会以小案例“登录注册”为例,依次引出  静态文件及配置、前后端数据交互(request对象及方法)、

Django连接Mysql、Django  ORM操作字段和数据的增删改查等内容

一、知识回顾

上周内容回顾
    1.纯手撸web框架
        1 socket自己写
        2 http数据自己处理
    

```
2.wsgiref模块( web服务网关接口)
    1 socket代码帮你封装好了 
    2 http数据自动帮你处理好了
        1.请求来的时候 帮你拆分http数据格式
        2.响应走的时候 有帮你封装成了符合http数据格式的数据

3.根据不同的功能拆封成不同的py文件
    urls.py  路由与视图函数对应关系
    views.py  处理后端业务逻辑的视图函数(视图函数不单单只是函数 也可以是类)
    templates  专门存放html文件
    
    规律:只要你想加功能 只需要在urls.py中添加一条对应关系
    再去views.py写一个视图函数 
 
4.动静态网页
    1.将后端获取到的时间传递给前端页面
        利用字符串的替换 实现数据传递
    2.将字典传递给前端页面 并且可以很方便的操作
        借助于jinja2模块实现模板的渲染
        from jinja2 import Template
        
        temp = Template(data)
        res = temp.render(user={'name':'jason'})
```

​        

```
    模板渲染:利用模板语法 实现后端传递数据给前端html页面
    
    模板语法书写格式 就两种
        变量相关:{{}}
        逻辑相关:{%%}
```

HTTP协议
    超文本传输协议
    

```
1.四大特性
    1.基于TCP/IP之上作用于应用层的协议
    2.基于请求响应
    3.无状态
        cookie,session,token,...
    4.无连接
        长连接 websocket
```

​    

```
2.数据格式
    请求格式 
        请求首行(请求方式  协议版本)
        请求头(一堆k:v键值对)  类似于开路先锋 提前告知对方一些必要的信息
        
        请求体(get请求没有请求体)
```

​        

```
    响应格式
```

​    

```
3.响应状态码
    1XX
    2XX
    3XX
    4XX
    5XX
```

请求方式
    get请求
        朝别人要数据(get请求没有请求体,get请求也可以携带参数)
    post请求
        朝别人提交数据(用户登录)
        
        
        
python三大主流的web框架
    django
    

```
flask

tornado
```



注意事项

python解释器推荐你使用3.4~3.6之间的  不要用3.7

django版本问题
    1.X
    2.X

pip3 install django==1.11.11

django-admin

django-admin startproject 项目名
    项目名
        跟项目名同名的文件夹
            __init__.py
            settings.py
            urls.py
            wsgi.py
        manage.py
python manage.py runserver  

一个空的django项目 就类似于一所大学
app就相当于大学里面的各个学院 每个学院都有自己所对应的功能

python manage.py startapp 应用名(尽量跟你的功能呼应)
    创建的应用一定要去settings.py文件中注册
    
命令行创建 templates文件没有,并且settings.py文件中也没有路径配置



pycharm创建
    能够自动帮你创建template文件夹和路径配置
    也能够支持创建一个应用并且自动注册
知识回顾和总结

 

二、Django小白三板斧

注意:

用户能够访问到的所有的资源 都是程序员提前暴露好的 如果没有暴露 用户就永远访问不了!

django是可以自动重启的 但是有时候反应速度比较慢,也有可能在你代码没写完的时候重启了 会报错 但是不用管!

小白三板斧:

1.小白必会三板斧
from django.shortcuts import render,HttpResponse,redirect
HttpResponse  # 返回字符串的
render  # 返回html页面
redirect  # 重定向

 

三、静态文件配置

静态文件:
  网站所用到的
    自己写好js
    自己写好css
    第三方的框架 bootstrap fontwesome sweetalert

通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下

STATIC_URL = '/static/' # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
# 手动配置静态文件访问资源
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    # os.path.join(BASE_DIR,'static2'),
]

在templates文件夹中的HTML中写如下代码进行引入,使得引入静态文件的令牌可以随着settings.py中的接口前缀的变化而变化!

//接口前缀 动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

接口前缀settings文件示例如下:

"""
Django settings for mysite project.

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

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

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/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/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'sf7cb+swi@9!o*@()3$@gn@5=r5!r^tv8hdl9h#!gq!5@va#m&'

# 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',
    'app01.apps.App01Config',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'mysite.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 = 'mysite.wsgi.application'


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

# django自带一个小型的sqlite3数据库
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',   # 指定django.db 的数据库
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'day57',
        'USER': 'root',
        'PASSWORD': 'qinsungui',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/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/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


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

STATIC_URL = '/static/'   # 访问静态资源的接口前缀
'''只要想访问静态资源,就必须以static开头,指得是html文件中的header位置。。
但是如果接口前缀发生变化的话,那么html文件中的header位置令牌也要改变,
'''
"""
问题引出方法:如果令牌改变“xxx”,那么有一万个html文件要怎么改变?
自动改变配置--代码:


"""
# 手动配置静态文件
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
settings.py

 

四、form表单提交post请求中间件问题

form表单 action参数可以写的形式   

  1.不写 默认朝当前地址提交   

  2.只写后缀/index/
  3.写全路径

注意:get请求,携带参数的缺点

form表单默认朝后端提交的方式 默认是get请求
get请求携带参数的方式 是在url后面?
url?username=admin&password=213213213213213
缺点
1.不安全
2.get请求携带的参数有大小限制(最大不能超过4KB左右)

 

前期你如果要提交post请求 你就去settings.py文件注释掉一个中间件

MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

 

五、request对象及其方法

request对象方法用于前后端数据交互,我们通过前端页面获得用户的数据如用户名和密码等,那如何区别不同的请求来

制定不同的方法?

获取请求方式:

print(request.method)

 

获取post请求携带的数据
        request.POST
       
    获取get请求携带的数据
        request.GET
    get和post在后端获取用户数据的时候 规律是一样的
    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>
    request.POST.get('username') 默认只取列列表的最后一个元素
    如果你想将列表完整的取出 你必须用getlist()

views.py代码示例如下:

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.

# def login(request):
#     '''
#     思考:不管是post 还是get请求都要通过login函数,所以我们要进行区分
#            针对不同的请求方式,有不同的处理逻辑
#     由于get请求比较常见,且业务逻辑简单,所以针对get不需要逻辑判断,默认是就是get请求
#     '''
#     if request.method=='POST':
#         # 获取前端传过来的用户名和密码,
#         print(request.POST)  #post请求提交过来的数据,是一个大字典<QueryDict: {'username': ['jason'], 'password': ['123'], 'hobby': ['basketball', 'football']}>
#         # 对request.POST 进行字典取值,注意get取值和getlist取值的区别
#         username = request.POST.get('username')
#         password = request.POST.get('password')
#         hobby = request.POST.getlist('hobby')
#
#     print(request.GET)
#     username = request.GET.get('username')
#     password = request.GET.get('password')
#     hobby = request.GET.getlist('hobby')
#     return render(request,'login.html')

 

六、pycharm连接数据库、Django连接数据库

获得前端页面的数据之后就要通过数据库中的数据进行对比和校验,以及对数据库中数据做出增删改查等操作!

Django连接数据库分两步:

'''
 第一步配置文件中配置
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',  # 指定数据库 MySQL postgreSQL
                    'NAME': 'day56',  # 到底使用哪个库
                    'USER':'root',
                    'PASSWORD':'root',
                    'HOST':'127.0.0.1', 
                    'PORT':3306,
                    'CHARSET':'utf8'
                }
            }

'''
'''
第二步 
            django默认使用的是mysqldb连接数据库  但是该模块不支持了
            所以你要告诉django不要用mysqldb该用pymysql连接
            
            你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
            import pymysql
            pymysql.install_as_MySQLdb()

'''

 

七、Django ORM 简介

'''
orm对象关系映射
    
    类                   数据库的表
    
    对象                  表的记录
    
    对象获取属性          记录的某个字段对应的值
    
    优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
    
    缺点:由于封装程度太高 可能会导致程序的执行效率偏低
    有时候 结合项目需求 可能需要你手写sql语句

'''

注意事项:

Django不会自动帮你创建库,库需要自己手动创建,

 

八、字段、数据的增删改查

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!