目 录
-
知识回顾总结
-
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小白三板斧
注意:
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') ]
四、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不会自动帮你创建库,库需要自己手动创建,
八、字段、数据的增删改查