首页 > 技术文章 > 【Django笔记0】-Django项目创建,settings设置,运行,流程总结

tensorzhang 2020-10-23 10:05 原文

Django项目创建,settings设置,运行

0,流程梳理-《python编程从入门到实践》

https://github.com/MrZhangKY/learning-log-by-django

1,=====================================django项目初始化===========================================
* 创建项目
django-admain startproject ***(projectName)

* 创建数据库
进入创建的项目
python manage.py migrate

* 启动/查看项目
python manage.py runserver [端口号]

2,========================================创建应用程序,数据和超级用户========================================
python manage.py startapp ***(APPName)
新创建的应用中最重要的文件是models.py、 admin.py和views.py
models.py用于定义要在应用程序中管理的数据(定义了数据库表的格式)
admin.py权限管理
views.py视图,通过应用的urls.py进行导入,视图会调用models.py中的模型以及模板templates。通常会将数据处理相关的代码放入views.py,而将HTML文件写入templates中,实现业务逻辑与前端渲染文件的解耦。

2.0,激活应用
要使用模型,必须让Django将应用程序包含到项目中。为此,打开settings.py(位于项目中与项目同名的文件夹中),
将新建应用程序***(APPName)添加到INSTALLED_APPS

2.1,models.py-管理数据用的模型定义和修改
* 定义模型
打开文件models.py,可以在里面创建自己的模型。模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类。
要获悉可在模型中使用的各种字段,请参阅Django Model Field Reference( Django模型字段参考),其网址为
https://docs.djangoproject.com/en/1.8/ref/models/fields/。

* 让Django修改数据库,使其能够存储与我们定义的新模型相关联的数据
python manage.py makemigrations ***(APPName)
该命令创建了一个名为****_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。
如果新添了外键,需要指定外键。

* 执行迁移,让Django替我们修改数据库
python manage.py migrate

* 每当需要修改模型或对同一应用增添新模型时,都是以上三个步骤:
修改models.py;对learning_logs调用makemigrations;让Django迁移项目。

2.2,admin.py-权限管理(哪些用户可以使用哪些模型)
* 创建超级用户
python manage.py createsuperuser

* 向管理网站注册模型
Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。注册是在admin.py中进行,
from ***(APPName).models import ***(modelName)
admin.site.register(***(modelName))

* 使用超级用户账户访问管理网站:访问http://localhost:8000/admin/,并输入刚创建的超级用户的用户名和密码,
所打开的网页让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型Topic相关的数据。

3,========================================创建网页,url和渲染========================================
* 创建网页的过程通常分三个阶段:定义URL、编写视图和编写模板。
首先,必须定义URL模式。 URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以确定返回哪个网页。
每个URL都被映射到特定的视图——视图函数获取并处理网页所需的数据。视图函数通常调用一个模板,后者生成浏览器能够理解的网页。

3.1,url链接
* 在项目主文件中定义 URL与各应用urls文件的 映射
打开项目主文件夹(与项目同名的文件夹)中的文件urls.py,在其中添加URL与各应用urls文件的映射关系

* 在各应用中创建urls文件(需要新建出来)
from . import views
从当前的urls.py模块所在的文件夹中导入视图views,此过程调用视图函数并通过调用关系进一步导入模板

3.2,视图views.py、模板、模板继承
* 编写视图views.py
在应用的views.py中编写视图函数
视图调用models中的模型(或者同目录下其他.py中的模型)以及模板templates
视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器——这通常是使用定义了网页是什么样的模板实现的。

* 编写模板templates
在应用文件夹中***(APPName)新建一个文件夹,并将其命名为templates;
在文件夹templates中,再新建一个文件夹,并将其命名为***(APPName);
在最里面的文件夹learning_logs中,新建一个文件,并将其命名为***.html(与views.py中的一致)进行模板的编写
官方文档:https://docs.djangoproject.com/en/3.2/ref/templates/

* 模板继承
创建网站时,有一些所有网页都包含的元素,可编写一个包含通用元素的父模板,并让每个网页都继承这个模板,从而避免在每个网页中重复定义这些通用元素。这种方法能让你专注于开发每个网页的独特方面,还能让修改项目的整体外观容易得多。
在子模板中,只需包含当前网页特有的内容。这不仅简化了每个模板,还使得网站修改起来容易得多。
要修改很多网页都包含的元素,只需在父模板中修改该元素,所做的修改将传导到继承该父模板的每个页面。
在包含数十乃至数百个网页的项目中,这种结构使得网站改进起来容易而且快捷得多。
在大型项目中,通常有一个用于整个网站的父模板——base.html,且网站的每个主要部分都有一个父模板。
每个部分的父模板都继承base.html,而网站的每个网页都继承相应部分的父模板。

* 创建网页的过程看起来可能很复杂,但将URL、视图和模板分离的效果实际上很好。
这让我们能够分别考虑项目的不同方面,且在项目很大时,让各个参与者可专注于其最擅长的方面。
例如,数据库专家可专注于模型,程序员可专注于视图代码,而Web设计人员可专注于模板。

4,========================================用户账户,用户和数据关联========================================
* Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方。
让任意数量的用户都能与之交互,是Web应用程序的核心所在。
需要创建对用户友好而直观的网页,让用户无需通过管理网站就能添加新的主题和条目,以及编辑既有的条目。
需要学习Django如何防范对基于表单的网页发起的常见攻击,这避免花太多时间考虑确保应用程序安全的问题。
需要添加一个用户注册系统,让用户能够创建账户。
需要实现一个用户身份验证系统,让有些页面只能供已登录的用户访问。
需要修改一些视图函数,使得用户只能看到自己的数据。

* 使用Django的表单创建工具来创建让用户能够输入数据的页面
当前,只有超级用户能够通过管理网站输入数据。我们不想让用户与管理网站交互,因此需要添加几个页面,让用户能够输入数据。
创建基于表单的页面的方法几乎与前面创建网页一样:定义一个URL,编写一个视图函数并编写一个模板。
一个主要差别是,需要导入包含表单的模块forms.py。
在Django中,创建表单的最简单方式是使用ModelForm,所创建的forms.py文件存储在models.py所在的目录中。
创建Web应用程序时,将用到的两种主要请求类型是GET请求和POST请求。
对于只是从服务器读取数据的页面,使用GET请求;在用户需要通过表单提交信息时,通常使用POST请求。
处理所有表单时,我们都将指定使用POST方法。

* 创建用户账户
建立一个用户注册和身份验证系统,让用户能够注册、登录、注销账户。
创建一个新的应用程序,其中包含与处理用户账户相关的所有功能。

* 让用户拥有自己的数据-关联用户和数据
对一些页面进行限制,仅让已登录的用户访问它们,并且确保每个主题都属于特定用户。
使用@login_required修改views.py中的模型函数,仅让已登录的用户访问它们。
将最高层的数据关联到用户,这样更低层的数据将自动关联到用户;修改模型,在其中添加一个关联到用户的外键,对数据库进行迁移;对有些视图进行修改,使其只显示与当前登录的用户相关联的数据。

5,========================================样式设置,项目部署========================================
* 首先专注于项目的功能,保证可以正确运行,之后再考虑样式设置的问题;应用程序能够正确运行后,外观就显得很重要了,因为漂亮的应用程序才能吸引用户使用它。
使用应用程序django-bootstrap3将Bootstrap继承到项目中。Bootstrap是一组工具,用于为Web应用程序设置样式,使其在任何现代设备上都看起来很专业。
django-bootstrap3需要在settings.py的INSTALLED_APPS中注册,在模板中进行使用(相当于css对html进行修饰)
django-bootstrap3官网:http://getbootstrap.com/,寻找提供的模板:单击Getting Started,再向下滚动到Examples部分。

* 将项目部署到一台服务器,让任何有网络连接的人都能够使用它
pip freeze > requirements.txt    创建包含包列表的文件 requirements.txt
pip install -r requirements.txt
通过git进行项目部署
  • django项目的调用关系如下图

1,项目创建

通过pip下载Django以后,在cmd中cd到想要创建项目的路径,之后输入:

django-admin startproject ***

就可以生成一个django项目,此处以test1为例,生成项目后可以使用 tree 命令查看项目的目录树结构:

tree /f test1

│  manage.py
│
└─test1
        asgi.py
        settings.py
        urls.py
        wsgi.py
        __init__.py

2,settings设置

​ settings是一个Django项目中很重要的配置文件,其中包含了一个项目所需要的全局变量。初始化项目以后,有以下几个位置的变量可以先行修改,其他的变量可以随着项目的进行再逐渐修改。

  • 语言和时区

    LANGUAGE_CODE='zh-Hans'  #设置为中文模式
    TIME_ZONE='Asia/Shanghai'   #设置为中国时间
    
  • 配置数据库(这里使用mysql,与django自带的sqlite数据库的区别可自行查阅)

    • 首先在mysql命令行界面中创建项目所需要的数据库
    D:\4,pytest>mysql -uroot -p
    Enter password: ***********
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 38
    Server version: 8.0.22 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database test1db;
    Query OK, 1 row affected (0.02 sec)
    
    • 之后在settings.py中进行配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test1db',
            'USER': '***',	#是安装mysql是设置的,或者为项目单独设置的
            'PASSWORD': '******',	#与USER对应的密码
            'HOST': '127.0.0.1',	#数据库服务器地址,这里是本地开发
            'PORT': '3306',	#mysql数据库端口号,默认为3306
        }
    }
    
    • 还需要在_init_.py中进行配置(mysql的驱动)
    import pymysql
    pymysql.version_info = (1, 4, 13, "final", 0)   #设定mysql版本
    pymysql.install_as_MySQLdb()
    
    • 数据库迁移
    python manage.py migrate
    

3,运行项目

在cmd中输入

python manage.py runserver

打开网址即可

http://127.0.0.1:8000/

问题:

  1. 为什么要执行数据库迁移?迁移带来的改变是什么?什么时候迁移(每次修改后都要迁移吗)?不迁移会怎么样?
  • 关系型数据库假设数据库中的所有数据符合一种模式(同样的表结构),该模式可以改变,改变时就需要用到模式迁移(数据库迁移)。
  1. Django与数据库的联系。
  • 数据存储在数据库中,用户通过Django操作数据库写入和写出。
  1. 数据库的数据文件保存在磁盘的哪个位置?可不可以更换位置?

推荐阅读