Python + Django 入门级开发手顺
一、python 简介
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 介绍
2.4 Http 请求的几种形式以及传参的方式
get、post、put、patch、delete
三、安装运行
pip install django
检查是否安装好了
python -m django --version
cd 到文件夹下,运行以下命令
django-admin startproject demo
python manage.py migrate
: 可以理解将文件里面的打包一下,将改动作用到数据库文件
python manage.py runserver localhost:80
:运行,指定地址和端口号(可以随心配置)
浏览器打开 localhost:80 ,看到页面即成功启动
注意(windows电脑上,manage.py 需要改成 文件目录形式 .\manage.py)
(疑问:这不是个后台框架吗?怎么有前端页面?回想下,从开始到现在什么时候说过这是个后台框架了?稍后看后面所谓的错误演示)
-
创建app:Django 中的app就是项目里一个应用的意思,一个项目包含多个app,一个app是一个单独的模块,比如 登录模块,用户管理模块(增删改 查),当然这也人定的,就是你们把所有文件接口全放到一个里面也没问题,就看抗不抗揍吧。
-
还是到根目录下命令:
python manage.py startapp users
这样会创建一个目录名为 users 的文件夹,自动生成app需要的各类文件
- 写一个 简单的 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
看看效果
当今社会前后端分离情况下的”错误演示”
第3步当中的疑问,django 能不能开发前端html页面,答案当然是能,如下:
先定义好HTML模板
html_template = '''
table {
border-collapse: collapse;
}
th, td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
}
id
姓名
电话号码
地址
001
张三
13388881111
法外狂徒,四海为家
'''
def userList(request):
return HttpResponse(html_template)
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'))
]
四、数据库
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/ ,登录就能看到可视化管理页面,进行增删改查,数据库里面也跟着变了
八、读取数据数据
查
def getUserList(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
qs = UserModel.objects.values()
# 将 QuerySet 对象 转化为 list 类型
# 否则不能 被 转化为 JSON 字符串
retlist = list(qs)
return JsonResponse({'code': 0, 'data': retlist})
增
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}
成功'})
删
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}
的客户不存在'
})
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': '修改成功'})
临时取消 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',
]
九、一个简单的小登录
python .\manage.py startapp login
根目录 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'
]
from django.urls import path
from login import sign_in_out
urlpatterns = [
path('signin', sign_in_out.signin),
path('signout', sign_in_out.signout)
]
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': '退出登录成功'
})
Original: https://blog.csdn.net/strong90/article/details/121421022
Author: strong90
Title: Python + Django 入门级开发手顺
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735634/
转载文章受原作者版权保护。转载请注明原作者出处!