Python + Django 入门级开发手顺
一、python 简介
1.1 安装python 解释器,网址:Welcome to Python.org,没啥说的老规矩双击下一步(ps:python3别选2)
1.2 基础语法教程:Python3 教程 | 菜鸟教程
1.3 优点:我的比喻是很像太极拳,学起来简单,真打起来就很难,易学难精。
易学:
1、因为Python 更像人类语言(英语),而不是机器语言。
2、Python 语法简洁易懂,屏蔽了很多底层的细节,更加容易学习
好用:
1、开发速度快,别的语言要 3天、5天 才能开发出来的软件,Python 可能只要 1天。
2、Python编程应用广泛,领域涵盖: Web网站 、自动化、爬虫、图形界面、数据分析、运维、自然语言处理、图像处理、科学计算、游戏、人工智能 等等
1.4 选几个常用的带大家一起看看
字符串、元祖、字典、集合、运算符、函数
二、Django 简介
2.1 经典面试题
从浏览器输入网址开始到整个网页显示出来,这个过程都经历了什么?
2.2 后端开发涉及的一些知识点
-
API 接口设计, 就是 定义 前端和后端交互接口规范。
目前流行的是REST API 。
-
数据库存储方案,比如:选择什么样的数据库,包括 关系型和非关系型的数据库。
-
数据库表结构设计, 要能合理、高效的存储业务数据,这样才能 高效查询、修改各种关联性的数据。
-
为了提高性能, 需要决定使用怎样的 缓存服务 和 异步任务服务
-
还有 其它种种特殊的考虑,比如 要熟悉目前日益流行的云存储技术,将有的数据,如图片,视频等 合理存储在云端
-
有的系统还需要有 大数据分析的需求 要后端高效实现。
2.3 Django 介绍
1、 官方网站: https://www.djangoproject.com
2、 基础语法类教程地址:Django 简介 | 菜鸟教程、Django 中文教程_w3cschool
2.4 Http 请求的几种形式以及传参的方式
get、post、put、patch、delete
三、安装运行
1、通过命令行安装 Django
pip install django
检查是否安装好了
python -m django --version
2、创建项目
cd 到文件夹下,运行以下命令
django-admin startproject demo
3、运行项目
python manage.py migrate
: 可以理解将文件里面的打包一下,将改动作用到数据库文件
python manage.py runserver localhost:80
:运行,指定地址和端口号(可以随心配置)
浏览器打开 localhost:80 ,看到页面即成功启动
注意(windows电脑上,manage.py 需要改成 文件目录形式 .\manage.py)
(疑问:这不是个后台框架吗?怎么有前端页面?回想下,从开始到现在什么时候说过这是个后台框架了?稍后看后面所谓的错误演示)
4、创建不同接口
1. 创建app:Django 中的app就是项目里一个应用的意思,一个项目包含多个app,一个app是一个单独的模块,比如 登录模块,用户管理模块(增删改 查),当然这也人定的,就是你们把所有文件接口全放到一个里面也没问题,就看抗不抗揍吧。
2. 还是到根目录下命令:
python manage.py startapp users
这样会创建一个目录名为 users 的文件夹,自动生成app需要的各类文件
5、http请求与url 路由访问
1. 写一个 简单的 api 接口
def userList(request): return HttpResponse('恭喜你拿到用户信息列表了~~~')
2、定义一个路由url
根目录demo文件夹中,找到 urls.py 的文件,在 urlpatterns 中添加路由信息
from users.views import userList urlpatterns = [ path('admin/', admin.site.urls), path('users/list', userList) ]
3、在浏览器输入 localhost:80/users/list
看看效果
6、错误的演示
当今社会前后端分离情况下的“错误演示”
第3步当中的疑问,django 能不能开发前端html页面,答案当然是能,如下:
# 先定义好HTML模板 html_template = ''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> table { border-collapse: collapse; } th, td { padding: 8px; text-align: left; border-bottom: 1px solid #ddd; } </style> </head> <body> <table> <tr> <th>id</th> <th>姓名</th> <th>电话号码</th> <th>地址</th> </tr> <tr> <td>001</td> <td>张三</td> <td>13388881111</td> <td>法外狂徒,四海为家</td> </tr> </table> </body> </html> ''' def userList(request): return HttpResponse(html_template)
7、正确演示
1、一个模块里面会含有多个接口,所以我们要分路由子表,比如 users 里面会有,用户列表接口,用户详情接口,很明显不可以把所有的都放到 根目录的 urls.py 里面
2、在 users 里面创建一个 urls.py 的文件,输入以下内容:
from django.urls import path from . import views urlpatterns = [ path('list/', views.userList), path('info/', views.userInfo) ]
3、在demo目录下的总路由表 urls.py 中,修改如下信息:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 引入 users 子路由表 # 凡是以 users/ 开头的 api 都从 users.urls 子路由表中获取 path('users/', include('users.urls')) ]
4、这样就可以通过 http://127.0.0.1:8000/users/list/ 接口获取到数据
四、数据库
1、数据库目前分为关系型数据库和非关系型数据库,本次教材以关系型数据库为例子,非关系型数据库的话,等下次讲 node.js + express.js + MongoDB 框架时再说吧
2、常用的开源数据库有 mysql 和 postgresql。这2个玩意配置起来比较麻烦(我就是没在windows上配置明白咋滴吧)。这个项目用个django-admin 自带的 sqlite 来讲解
3、sqlite 没有 独立的数据库服务进程,数据操作被做成库直接供应用程序调用。 Django中可以直接使用,无须先搭建数据服务。
4、之前运行项目时,执行 python manage.py migrate
就已经给我们的工程生成数据库文件 db.sqlite3。可以下载数据库可视化软件查看,以前我做iOS的时候,用过这 SQLiteStudio 下载,可以看到已经帮我们生成了一些基本表。包括登录的 auth_user、djanngo_session等
五、ORM
Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。
通常,在Django中
-
定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类
-
定义该表中的字段(列), 就是定义该类里面的一些属性
-
类的方法就是对该表中数据的处理方法,包括 数据的增删改查
这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成 面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。
这样做:
首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;
其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。
这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping)
六、数据库表的增删改查
1、在 users 文件中的 models 里添加以下代码,这就是数据表的ORM
from django.db import models # Create your models here. class Usermodel(models.Model): # 名称 CharField 对象,对应 varchar类型的数据库字段 name = models.CharField(max_length=20) # 联系电话 phone = models.CharField(max_length=11) # 家庭住址 address = models.CharField(max_length=200)
2、在根目录中的 settings.py 里面声明
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 声明app 'users' ]
3、终端执行命令
python .\manage.py makemigrations users
python .\manage.py migrate
执行完成后,打开 SQLiteStudio 可以看到 数据库表中已经同步了 models 中定义的字段
七、Django Admin的数据管理
分两种:
一是直接操作数据库表增加,但是这种比较危险
二是使用Django提供的一个管理员操作界面来修改model的数据,今天以这个为主
创建一个超级管理员账号
-
进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码
python manage.py createsuperuser
-
users 目录下的models里面注册 model
from django.contrib import admin # Register your models here. from users.models import UserModel admin.site.register(UserModel)
-
输入网址 http://127.0.0.1:8000/admin/ ,登录就能看到可视化管理页面,进行增删改查,数据库里面也跟着变了
八、读取数据数据
1、查
# 查 def getUserList(request): # 返回一个 QuerySet 对象 ,包含所有的表记录 qs = UserModel.objects.values() # 将 QuerySet 对象 转化为 list 类型 # 否则不能 被 转化为 JSON 字符串 retlist = list(qs) return JsonResponse({'code': 0, 'data': retlist})
2、增
# 增 def addUser(request): postData = json.loads(request.body) info = postData['data'] # 从请求消息中 获取要添加客户的信息 # 并且插入到数据库中 # 返回值 就是对应插入记录的对象 record = UserModel.objects.create(name=info['name'], phone=info['phone'], address=info['address']) return JsonResponse({'code': 0, 'id': f'添加id为 `{record.id}` 成功'})
3、删
# 删 def deleteUser(request): userId = request.GET.get('id') userinfo = UserModel.objects.filter(id=userId) if userinfo.exists(): # delete 方法就将该记录从数据库中删除了 print("用户存在") userinfo.delete() return JsonResponse({'code': 0, 'msg': f'删除id为`{userId}`的账号成功'}) else: print("不存在") return JsonResponse({ 'code': 1, 'msg': f'id 为`{userId}`的客户不存在' })
4、改
def modifyUser(request): # 获取 url 上的参数 userId = request.GET.get('id') # 获取 body 中的参数 newdata = json.loads(request.body) print("aaaa ===", newdata) try: # 根据 id 从数据库中找到相应的客户记录 user = UserModel.objects.get(id=userId) except UserModel.DoesNotExist: return JsonResponse({ 'code': 1, 'msg': f'id 为`{userId}`的客户不存在' }) if 'name' in newdata: user.name = newdata['name'] if 'phone' in newdata: user.phone = newdata['phone'] if 'address' in newdata: user.address = newdata['address'] # 注意,一定要执行save才能将修改信息保存到数据库 user.save() return JsonResponse({'code': 0, 'msg': '修改成功'})
5、 注意的地方:
临时取消 CSRF 校验
根据接口文档,添加客户 请求是个Post请求
POST /域名/api/signin HTTP/1.1 Content-Type: application/x-www-form-urlencoded
注意,缺省创建的项目, Django 会启用一个 CSRF (跨站请求伪造) 安全防护机制。
在这种情况下, 所有的Post、PUT 类型的 请求都必须在HTTP请求头中携带用于校验的数据。
为了简单起见,我们先临时取消掉CSRF的 校验机制,等以后有需要再打开。
要临时取消掉CSRF的 校验机制,非常简单,只需要在 项目的配置文件 bysms/settings.py
中 MIDDLEWARE
配置项 里 注释掉 ‘django.middleware.csrf.CsrfViewMiddleware’ 即可。
如下所示
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 注释掉这段代码 不用csrf中间件校验 # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
九、一个简单的小登录
1、创建login app
python .\manage.py startapp login
2、引入
根目录 urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 引入 users 子路由表 # 凡是以 users/ 开头的 api 都从 users.urls 子路由表中获取 path('api/users/', include('users.urls')), # 添加登录 path('api/login/', include('login.urls')) ]
settings.url
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 声明app 'users', 'login' ]
3、子路由
from django.urls import path from login import sign_in_out urlpatterns = [ path('signin', sign_in_out.signin), path('signout', sign_in_out.signout) ]
4、登录方法
import json from django.http import JsonResponse from django.contrib.auth import authenticate, login, logout # 登录处理 def signin(request): postData = json.loads(request.body) userName = postData["username"] password = postData["password"] user = authenticate(request, username = userName, password = password) print(user) if user is not None: if user.is_active: if user.is_superuser: login(request, user) request.session['userType'] = 'mgr' return JsonResponse({'ret':0, 'msg': '登录成功'}) else: return JsonResponse({ 'ret': 1, 'msg': '请使用管理员账号登录' }) else: return JsonResponse({ 'ret': 0, 'msg': '用户已经被禁用' }) else: return JsonResponse({ 'ret': 1, 'msg': '用户名密码错误' }) def signout(request): logout(request) return JsonResponse({ 'ret': 0, 'msg': '退出登录成功' })