python web 开发 - Django 入门

一世执手 提交于 2020-02-02 05:45:42

开篇

通过上一篇 python 入门实战 - 学生管理系统 练习了一把 python 语法。本篇总结下 Django 这个 web 框架的入门使用。前提是要有相关的 web 开发经验(Java, php等)。因为本文不会涉及 http 协议,前后端分离不分离等概念。

另附:

  1. 官方教程: https://docs.djangoproject.com/en/3.0/intro/tutorial02/
  2. 菜鸟教程: https://www.runoob.com/django/django-tutorial.html

正文

本人开发环境

  • 操作系统: MacOS
  • IDE: vscode
  • 数据库: mysql
  • python 版本 3.x

准备工作

  1. 安装 django (非 maOS 操作系统 请参考开篇的教程选择安装方式,以及验证是否安装成功)

     python3 -m pip install django==1.11.6
    
  2. 创建项目

     django-admin startproject helloworld(这个是项目名)
    

图中标记了 4 个地方
1. 创建完 helloworld 项目后,会发现helloworld 下面还有一个 helloworld, 后面说到的 helloworld 一般都是第一层级,简称项目根目录
2. settings.py 主要是一些配置,比如数据库,静态文件存放位置等
3. urls.py 主要配置 url 和 函数的映射关系
4. manage.py 提供用来管理项目的命令,比如启动项目,后面请多留意
  1. 进入项目根目录

    cd helloworld
    
  2. 启动项目,并访问

(这里会启动失败,原因是 python3 和 django 的兼容问题,反正我用的 django 版本存在这个问题,解决方式就是删除某个文件的一个 逗号,如果遇见了,百度一搜就明白了,具体内容当初忘记保存了)

    python3 manage.py runserver
    // 当然也可以指定ip:host
    python3 manage.py runserver localhost:8080

  1. 至此一个 web 项目雏形已经有了

继续完善

至此我们就可以自行开发 web 应用了,但是你也许还会问

  1. http 请求调用的函数写在哪里,以及函数 和 页面的映射关系如何体现
  2. 静态文件的存放位置

下面就新建的 helloword 项目进行讲解

问题 1. 函数及其映射关系

找到 helloworld/helloworld/ 下面有个 urls.py 文件

默认配置:

    from django.conf.urls import url
    from django.contrib import admin
   
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]

修改后:

    from django.conf.urls import url

    from django.contrib import admin

    # 下面是新增的
    from django.shortcuts import HttpResponse, render, redirect

    # 1. 跳转页面
    # render 表示 访问 http://localhost:8000/index 会跳转到 index.html 页面
    def index(request):
        return render(request, 'index.html')

    # 2. 跳转页面,并携带参数
    def index02(request):
        return render(request, 'index.html', {'参数名', 值})
        
    # 3. 重定向
    def index03(request):
        return redirect('/index/')
        
    # 4. 接收参数
    def index04(request):
        # 接收 post 请求参数
        request.POST.get('参数名')
        # 接收 get 请求参数
        request.GET.get('参数名')
        return render(request, 'index.html')     
    
    # 配置 url 映射
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 配置 url 映射
        # 访问 http://localhost:8000/index/ 就会调用上面的 index 函数
        url(r'^index/', index), 
        
        # TODO 省略 index02, index03, index 04 映射配置
    ]
  1. 静态文件存放位置

找到 helloworld/helloworld/ 下面有个 settings.py 文件

html 文件配置: 大概 50 多行的位置

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
     
    # 修改这个配置项如下
    # 然后在项目根目录下,新建 templates 目录,用于存放 html 文件
    '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',
            ],
        },
    },
]

css,js ,image 文件配置: 在 settings.py 文件末尾

STATIC_URL = '/static/'  # 在 项目根目录 helloworld 下面

# 当然还有别名的用法,刚开始学,多说无益

如何在 html 中引用 css,js

<!DOCTYPE html>
<html lang="en">
<head>
    <script src='/static/test.js'></script>
    <title>Document</title>
</head>
<body>

</body>
</html>

规范项目

上面有些写法多为练习使用,因此不太规范。比如我们在 helloword/helloword/urls.py 写了一大堆函数,非常不雅观。所以现在引入一个新的东西。

  1. 在项目根目录下,执行

     python3 manage.py startapp app(模块名)
     
     # 这是我们第二次使用  manage.py 这个文件,
     # 第一次是启动项目,现在应该可以理解 这个文件是干嘛用的
     # 执行结束,我们会发现项目根目录下多了一个 app 目录
    

  1. 让 django 知道你新增的 app 模块

      INSTALLED_APPS = [
             'django.contrib.admin',
             'django.contrib.auth',
             'django.contrib.contenttypes',
             'django.contrib.sessions',
             'django.contrib.messages',
             'django.contrib.staticfiles',
     		# 新增 
             'app.apps.AppConfig'  # 也可以直接写 'app'
     		# app 就是新增的目录名 后面的 固定,
     		# 你也可以打开  app/apps.py 文件,看看
         ]
    
  2. app 目录下 有个 views.py 文件,我们可以把函数定义在这里。

     from django.shortcuts import HttpResponse, render, redirect
    
     def index(request):
     
         return render(request, 'index.html')
    
  3. 然后回到 helloword/helloword/urls.py 文件中,修改后如下:

     # 1. 导入函数
     from app.views import index
     
     # 2. 配置
     urlpatterns = [
         url(r'^admin/', admin.site.urls),
         url(r'^index/', index),
     ]
    

附加

如何配置 mysql 数据库

同样找到 helloworld/helloworld/ 下面有个 settings.py 文件,大概 70-80行左右

修改后如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'student_sys', # 库
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': 3306
    }
}

然后找到 helloworld/app/init.py 文件

文件默认是空的, 添加如下配置

import pymysql

# 告诉 django 用 pymysql 代替 mysqldb
pymysql.install_as_MySQLdb()

引入 orm

进入 helloworld/app/ 目录找到 models.py 文件,修改如下:

from django.db import models

# 定义一个 Student 类
class Student(models.Model):
    id = models.AutoField(primary_key=True) # 主键
    name = models.CharField(max_length=20) # 字符类型
    sex = models.CharField(max_length=2)
    birthday = models.CharField(max_length=10)

    
    def __str__(self):
        return self.name + "\t" + self.sex + "\t" + self.birthday

在项目根目录 helloworld 下依次执行

python3 manage.py makemigrations

python3 manage.py migrate

会自动帮我们生成表

也许你还会困惑:

  1. 为什么就定义了一个 model,生成了那么多表
  2. 修改 model 后,怎么自动更新表结构
  3. 如何 crud 等等

~~~~~ 请自行探索

总结

自我吐槽: 其实这样的教程很鸡肋,担心篇幅过长看的人眼花缭乱。

  • 很多地方没有给出解释,比如 settings.py 的一些配置,自动生成表等
  • 遗留了很多问题没有给出答案,甚至有些问题都没在文中提到,比如,访问页面会出现 403,该如何解决
  • 之所以没讲那么多,是觉得那些问题很容解决

写完之后,感觉本文的定位更多的是自我总结,可能你们看到这文章会吐槽,喷我~~~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!