Django的日常-1

Django中最常用的三个东西

之前我们介绍了Django的安装和创建,以及其基本原理,接下来我们就逐步介绍Django里面常见的一些东西,以下三种通常都是用来作为返回值的.

HTTPresponse

用来返回字符串

return HttpResponse('hello world~')

# 会返回一个字符串,即屏幕上只会剩下这一个字符串,用处比较有限,不过也算有用

render

用来返回一个网页,这个用处比较大,比如

def reg(request):
return render(request,'reg.html')
# request的用处我们在下面会介绍,这个例子的意思就是最终会返回一个reg.html网页,通常我们在浏览网页的时候,网页之间的切换也许会用到这个,也许不会,这只是一种选择.

redirect

重定向,重定向的概念我们在之前介绍http协议的时候介绍过,所以我们定义重定向的话可以直接将当前网页转到重定向后的网页.

def home(request):
return redirect('https://baidu.com')
# 即在触发了这个函数之后就会直接跳向重定向的网页

静态文件相关

网站所用到的静态文件通常包括以下几类,即自己写好的JS,自己写好的CSS或者我们所引用的第三方框架,bootstrap,fontwesome,sweetalert等等.

在之前我们了解到,在引入第三方框架的时候我们可以选择用cdn在线缓存的文件,或者自己下载下来,用本地的静态文件.这里我们选择用静态文件,然后就需要把这些静态文件统一放在一个文件夹里面,通常我们会放在一个新建的名为static的文件夹里,约定俗成的,没什么道理.

但是要注意的一点是,在我们把所有的静态文件都扔到文件夹里之后,Django并不能很准确的去识别这个路径,就算我们在html界面里用根目录来引用这些文件也不行,Django本身找不到,所以,我们要配置一下路径

配置静态文件的访问资源是在根目录下的settings.py文件里,在最后我们会看到

# settings.py文件的最下方

STATIC_URL = '/static/'
# 这是我们访问静态资源的接口前缀,很重要,就是我们输网址的时候要写的接口前缀
# 然后我们需要在这个语句下面加上这样一个配置项
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 拼接路径名
]

在添加好路径之后,我们在html文件引入方式也需要改变,如下:

# **.html文件,<head>在这里面添加以下语句</head>

{% load static %}
<link rel="stylesheet" href="{% static '静态文件所在地址'%}"> # 这样都配置过之后,我们才能正确的引入这些静态文件,并正确引用他们.

form表单的get与post

form表单是我们熟悉前端的时候学到的东西,其标准格式如下

<form action="" action="" method="post">
# action参数可以写的是:
1. 空着,会默认向当前页面的地址提交
2. 只写后缀,如/index,/admin等,则会在前面自动拼接上当前的网址和端口,然后拼接上所写的后缀
3. 写全路径
# method参数,默认是get,还可以写post
我们要知道这两者的区别,get,当我们输入网址,进入网址的时候,此时服务端是已经收到了一个get请求的,所以我们才能接收到一个网页,这个网页就是服务端对于我们的get返回的一个返回值,但是get请求本身是有一些问题的,主要体现在以下两点:
1. get请求不安全,因为get请求在携带参数的时候是直接在url?后面添加的,比如?username=admin&password=159789
所以这种情况下,如果是输入的账号密码然后发送一个get请求,是非常不安全的
2. get请求所能携带的参数是有长度限制的,根据每个浏览器的不同,都会有不同长度的限制 # 在了解了以上内容之后,如果我们想要提交post请求,除了把method里面参数改成post之外,还需要注释掉一个语句,这个语句对于我们初学者来说没有用处,还会影响整个项目的运行.
# 其位置仍然在settings.py文件里,我们需要注掉的就是'django.middleware.csrf.CsrfViewMiddleware'这个语句
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

requests是我们写每一个views方法的时候都会在括号里传的参数,其最大的作用就是负责前端和后端数据的交互,后端所收到的前端的信息几乎全都来自于requests中,request是一个对象,而且是一个非常全面且强大的对象,我们可以通过这个对象点出来很多东西,比如:

request.MATE

# mate所包含的是几乎所有的HTTP的请求信息,以k:v键值对的形式存储的

request.scheme
# 请求的方式,可能性是两种,即http和https request.path
# 请求的路径,这里是低昂对路径,如果要取绝对路径是request.get_full_path()
request.encoding
# 获取提交的数据的编码方式
request.session
# 获取是一个session,实际上就是一个无序的字符串,用来作为唯一识别吗的,因为之前我们说过http是一个无状态的协议,需要另外的东西来确保用户的状态
request.cookies
# 与session非常相似的一个东西,区别就在于session在服务端,cookies在客户端
request.method
# 获取请求方式,GET或者POST
request.body
# 请求的主体,返回数据的格式是一个字符串
request.data
# 请求的数据部分,和body相似,但是格式不同,data是一个字典对象
request.POST
# 获取POST请求所携带的数据,可以直接当成一个列表套字典来取值,但是仅仅用request.POST.get()只能取到列表的最后一位,如果要取整个列表的话需要用request.POST.getlist()来取值
request.GET
# 用法和POST几乎一样,就是获取GET()请求所携带的数据

模板的传值方式

def reg(request):
user_dict = {'name': 'jason', 'pwd': 123}
# 给模板传值的方式1
return render(request, 'reg.html', {'xxx': user_dict}) # 会将user_dict传递给reg.html页面,页面上通过xxx就能拿到该字典 # 给模板传值的方式2
return render(request, 'reg.html', locals()) # 会将当前名称空间中所有的变量名全部传递给页面
# locals()会出现效率问题,变量名很多的话,会造成空间浪费,不过个人学习的话,其实直接用locals()没什么问题

Django连接数据库及其强大的ORM

我们知道,数据库就可以当做是一个服务端,我们可以用Navicat来连接数据库,也可以直接用cmd窗口来操作数据库,同样的,我们通过Django也可以连接数据库,以及对其进行操作

Django连接数据库的前期准备

  1. 首先我们需要在Django的配置文件里写入要连接的数据库的信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库MySQL,postgreSQL
'NAME': 'db1', # 使用哪个库
'USER': 'root', # 数据库账号
'PASSWORD': 'root', # 数据库密码
'HOST': '127.0.0.1', # 数据库的地址
'PORT': 3306, # 数据库的端口
'CHARSET': 'utf8' # 数据库的默认字符编码
}
}
  1. 然后,Django默认使用的数据库是musqldb,然而现在这种工具几乎已经绝版了,所以我们需要告诉Django不要用mysqldb,而是用pymysql来连接数据库,这里常见的有两种方法

    • 在Django的项目名下的__init__.py里写入下面语句
    • 在Django的app名下的__init__.py里写入下面的语句
    import pymysql
    pymysql.install_as_MySQLdb()

ORM语句创建表

Django里面的ORM可以帮助我们创建表,但不能直接创建数据库,所以我们要先手动创建数据库,然后通过ORM来创建表.

首先我们需要在app名下的models里面写入需要添加进数据库的表,包括各种字段,例程如下:

from django.db import models

# Create your models here.
class Userinfo(models.Model):
# 设置id字段为Userinfo表的主键,id int primary key auto_increment
# django里面可以不指定主键字段,django的ORM会自动给当前表新建一个名为id的主键字段
id = models.AutoField(primary_key=True)
# 设置username字段, username varchar(64) CharField必须要指定max_lenth参数
# django 的ORM中,没有char字段,但是django暴露给用户可以自定义char字段
username = models.CharField(max_length=64)
# 设置password字段, password int
password = models.IntegerField()
phone = models.BigIntegerField(default=110) # 新增的字段可以提前设置默认值,如果没有提前设置,那么一定要设置可以为null,否则不让你添加字段
addr = models.CharField(max_length=64, null=True) # 该字段可以为空 class Book(models.Model):
title = models.CharField(max_length=64)

在定义好上述类之后,我们就可以通过以下两个语句来真正创建表

# 以下两个语句是在cmd窗口,或者说是在Pycharm里面的Terminal窗口里输入的,注意当前目录,一定要在项目所在的位置
python manage.py makemigrations #不会创建表,仅仅是生成一个记录,将你当前的操作记录下来(migrations文件夹)
python manage.py migrate #真正的将你的ORM语句迁移到数据库中 # 尤其要注意的是:只要在models.py中修改了跟数据库相关的代码,就必须重新开始执行上面两个语句,注意,必须重新执行!!!

ORM语句对数据库的简单操作

这里介绍最简单的两种操作,即插入和查询

数据的插入

models.Userinfo.objects.create(username='admin', password='123')
# 上述语句实现的就是这个sql语句:insert into userinfo(username,password) values('admin','123');
# create方法会有一个返回值,返回值就是当前被创建的数据对象
# 这里要注意的是,你要清楚的知道自己插入的表的字段的数量,以及格式,否则很容易报错

数据的查询

# 1. get() 当查询条件不存在的时候会直接报错,如果存在会直接给你返回数据对象本身(不推荐使用)
res = models.Userinfo.objects.get(username=username) # select * from userinfo where username = 'jason'
print(res)
print(res.username, res.password) # 2. filter() 查询
# 当条件存在的情况下,无论数据有几条,返回的都是列表套对象的数据格式
# filter可以放多个查询条件,并且是and关系
# filter查询出来的结果当做列表去对待,支持正数的索引取值和切片,不支持负数,所以不能用[-1]
res = models.Userinfo.objects.filter(username=username, password=password)
# user_obj = res[0]
user_obj = res.first() # 取queryset第一个元素

数据的编辑

def edit_user(request):
edit_id = request.GET.get('edit_id')# 这里我们要获取前端发过来的数据中的edit_id字段,同时也是主键字段,以此为依据来取出来数据库中的该条数据
if request.method == 'POST':#如果是POST发送数据,而不是GET取数据
# 将用户新修改的所有数据
username = request.POST.get("username")
password = request.POST.get("password")
'''
POST请求中,也是可以获取GET请求携带的参数的'''
# 去数据库中修改对应的数据
# 方式一:
models.Userinfo.objects.filter(pk=edit_id).update(username=username, password=password) # 批量更新,即update方法会将filter查询出来的queryset对象中所有的数据对象全部更新 # 方式二:先获取当前数据对象,然后利用对象点属性的方式,先修改数据,然后调用对象方法保存
# 不推荐使用第二种方式,效率低,因为需要挨个重新写入数据,而不是update那种只更新有变化的
# edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
# edit_obj.username = username
# edit_obj.password = password
# edit_obj.save() # 跳转到数据展示页面
return redirect('/userlist')
# 以edit_id为依据来取出数据库中的数据,取出的是一个对象
edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
return render(request, 'edit_user.html', locals())

数据的删除

def delete_user(request):
# 获取想要删除的数据id 直接删除
delete_id = request.GET.get('delete_id')
models.Userinfo.objects.filter(pk=delete_id).delete() # 批量删除,即filter匹配到的符合条件的数据都会删除
return redirect('/userlist')

Django的日常-数据传输的更多相关文章

  1. Django的日常-AJAX

    目录 Django的日常-AJAX AJAX简介 AJAX与JQ的一个实例 AJAX与contentType AJAX传json格式 AJAX传文件 Django的日常-AJAX AJAX简介 首先A ...

  2. Django的日常-模型层(2)

    目录 Django的日常-模型层(2) 几种常用的查询方式 聚合查询 分组查询 F和Q查询 查询优化相关 orm中常见字段 choices参数 orm的事务操作 Django的日常-模型层(2) 几种 ...

  3. Django的日常-模型层(1)

    目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...

  4. Django的日常-视图层

    目录 Django的日常-3 JsonResponse form表单上传文件 CBV的源码分析 视图层 模板传值 过滤器 标签 自定义过滤器和标签 Django的日常-3 JsonResponse 在 ...

  5. Django的日常-路由层

    目录 Django的日常-2 路由层 有名分组和无名分组 反向解析 路由的分发 Django的日常-2 路由层 我们之前已经接触过路由层,只是我们可能不知道他叫这个名字,实际上在Django里面路由层 ...

  6. Django 前后端数据传输、ajax、分页器

    返回ORM目录 Django ORM 内容目录: 一.MTV与MVC模式 二.多对多表三种创建方式 三.前后端传输数据 四.Ajax ​ 五.批量插入数据 六.自定义分页器 一.MTV与MVC模式 M ...

  7. django前后端数据传输学习记录

    在开发过程中会遇到这样的情况 后台返回了一堆的数据,是一个列表 例如 datas = [{"a":1, "b":2}, {"c": 3,&q ...

  8. 服务器部署 Vue 和 Django 项目的全记录

    本篇记录我在一个全新服务器上部署 Vue 和 Django 前后端项目的全过程,内容包括服务器初始配置.安装 Django 虚拟环境.python web 服务器 uWSGI 和反向代理 Nginx ...

  9. 6 Django系列之关于models的sql语句日常用法总结

    preface Django提供了强大的ORM,我们可以通过ORM快速的写出我们想要对数据做什么样操作的代码.下面就说说我在日常工作中的用法: 外键关联精确查询 应用场景:表A host字段关联到了表 ...

随机推荐

  1. 在webpack4 中利用Babel 7取消严格模式方法

    报错信息: Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on stri ...

  2. Scrapy框架: middlewares.py设置

    # -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...

  3. [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  4. Python之循环遍历

    range() 快输生成序列 利用 items()提取字典元素 在Python里,for循环后面是可以接一个else 的,在for循环正常结束时候,else 语句会被执行(while循环也是一样哦), ...

  5. Python之实现一个优先级队列

    问题 怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq ...

  6. OpenGL学习——绘制第一个三角形

    终于把三角形绘制出来了,首先一些关键概念.操作. Vertex Data                       顶点数据 VBO Vertex Buffer Objects  顶点缓冲对象 VA ...

  7. python_django_上传文件

    存储路径: 存储在服务器的项目的static/upfile(你说了算的文件名,但是一般俺们叫这个)文件中 配置: 配置settings.py文件 MDEIA_ROOT = os.path.join(B ...

  8. koa-artTemplate 的使用

    1.父页面 <html> <head> <meta charset="UTF-8"> <title>我的音乐</title&g ...

  9. 如何设置和使用MacOS上的Microsoft Office套件

    自30年前首次发布以来,Microsoft Office已成为全球最受欢迎的生产力套件之一.借助Word和Excel for Mac之类的程序,毫无疑问,MS Office套件在任何计算机上都是必须下 ...

  10. Mysql学习笔记(001)-常见命令

    常见命令 SHOW DATABASES; /* use test; create database myemployees; use myemployees; create table employe ...