Python + Django 入门级开发手顺

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)

(疑问:这不是个后台框架吗?怎么有前端页面?回想下,从开始到现在什么时候说过这是个后台框架了?稍后看后面所谓的错误演示)

  1. 创建app:Django 中的app就是项目里一个应用的意思,一个项目包含多个app,一个app是一个单独的模块,比如 登录模块,用户管理模块(增删改 查),当然这也人定的,就是你们把所有文件接口全放到一个里面也没问题,就看抗不抗揍吧。

  2. 还是到根目录下命令:

python manage.py startapp users

这样会创建一个目录名为 users 的文件夹,自动生成app需要的各类文件

  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 看看效果

当今社会前后端分离情况下的”错误演示”

第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.pyMIDDLEWARE 配置项 里 注释掉 ‘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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球