欢迎食用『主界面』~,这里是赵苦瓜的看板娘desu~

#
【点滴记录】Django的初步学习(Django的安装、虚拟环境和Djago的初步配置)
首页 > 点滴记录    作者:赵苦瓜   2021年1月18日 8:18 星期一   热度:1572°   百度已收录  
时间:2021-1-18 8:18   热度:1572° 

Python&Django.jpg

Django是当前Python世界最富盛名且成熟的网络框架。最初用来制作在线新闻的Web站点。它采用了MVC的框架模式,也有很多人把它称为MVT(MTV)模式。

官方网站:

https://www.djangoproject.com/


Django的版本支持时间如图所示(图片源自官网)

因此我们安装2.2 LTS版本(长期支持版本)


pip install Django==2.2
Defaulting to user installation because normal site-packages is not writeable
Collecting Django==2.2
  Downloading Django-2.2-py3-none-any.whl (7.4 MB)
     |███████████████▌                | 3.6 MB 18 kB/s eta 0:03:28 


直接执行pip install Django是会默认安装最新版的。我们可以在后面加上==版本号 来指定要安装的版本。

如果你发现正在安装,却安装错版本了,可以按Ctrl + C 强制停止。


安装Django.png

如图所示,这样就安装完了。我们可以在Python中import一下试试有没有安装成功:

>>> import django
>>> 

如果下载很慢的话可以指定国内的源,如在后面直接加上 -i https://pypi.douban.com/simple

——————————————————————————————————————————

以下是根据千峰的Python课程学习的:

https://www.bilibili.com/video/BV1w7411x7HU

Django框架的基本原理

Django基本原理.png


MVC设计模式:一种软件设计典范。一种业务逻辑,使数据,界面显示分离的方法组织代码,讲业务逻辑聚集到一个部件里面,在改进和个性化定制界面和用户交互的同时 ,不需要重新编写业务逻辑。核心思想:解耦。优点:降低各模块之间的耦合性,方便变更,更容易重构代码,最大程度实现了代码的重用。

Model:用于封装应用程序的数据和操作和对数据处理的方法,只提供功能性接口。

View:负责数据的显示和呈现,是对用户的直接输出。

Controller:负责从用户端收集用户的输入,主要用于处理用户交互。

百度百科图解:

百度百科图解.jpg

MVC.png

MVT本质上和MVC没有区别,只是定义上有些许不同。

Modle:负责业务对象与数据库(ORM)的对象的交互。

Viev:视图函数,用来处理业务逻辑,并在适当的时候调用Model和Template。

Template:负责把页面展示给用户。

除此之外,Django里面还有一个url分发器(路由),主要用来将一个个URL页面的请求分发给不同的View进行处理,View再调用相应的Model和Template。


MVT设计模式.png

————————————————————————————————————————

虚拟环境

为了防止兼容性问题,本次创建Django项目使用虚拟环境。由于我们本地已经配置好了需要的环境,所以在Pycharm上直接继承即可。

Pycharm创建.png

注意,这种方法仅限于本地已经安装好所有环境。如果在这个的基础上再安装其它环境可能会出现问题,详见这篇博客:

https://www.jianshu.com/p/b4629ee87e80

另外,创建的时候如果不勾选这个Inherit global site-packages则会默认下载最新版的包。

如果环境不想使用最新版,可以借鉴以下博客采取的方法:

https://www.yunliyunwai.cn/blog/detail/37cc6eb052a72bd6a2177797143bd94a

或者这一个:

https://www.cnblogs.com/guohengnan/p/13471310.html

Linux:

创建虚拟环境 mkvitualenv    deactivate  workon  rmvirtualenv

创建django项目 django-admin startproject XX

————————————————————————————————————————

基本配置

打开settings.py

ALLOWED_HOSTS = ['*']             #通配符表示都可以访问

然后因为没有模板,需要把模板目录删除,否则会报错:


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

这样就可以运行啦~(直接点运行按钮运行)

当然也有在Terminal里面的运行方式

python manage.py runserver ip和端口,也可以直接写端口

运行成功.png

当然,直接这样打开是英文的,咱也可以把它改成中文。

在settings的底部:

LANGUAGE_CODE = 'zh-hans'            #把en-us改为zh-hans

修改完之后就是中文的啦。

下一行时区,可以改成Asia/Shanghai

TIME_ZONE = 'Asia/Shanghai'        #把UTC改为Asia/Shanghai


另外还有一点要注意,2.2版本的Django有个报错的BUG,

前台显示“A server error occurred. Please contact the administrator.

而后台显示“UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence”

这个是2.2版本的BUG导致的。可以把django目录下的views里面的debug.py的大概第332行


with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding='utf-8') as fh:
open里面加上一条encoding='utf-8'即可显示正常的错误页面


————————————————————————————————————————

连接SQLite数据库

Django默认使用的数据是SQLite,这是一种轻量级数据库。常用于智能手机,便于开发,但是不适用于企业开发。

常规操作95%和MySQL是一样的。真正开发还是要用MySQL。

创建Django时会默认生成一个db.sqlite3。

那么在Pycharm中如何连接呢?如果是已识别的文件,直接右键,选择 As Data Sourse..即可

但是我的Pycharm右键里面没有这个选项,他也不识别sqlite3文件,我是这样解决的:

首先点击右边的Database,点击加号,选择Data Sourse ,SQLite

之后File里面选择这个db.sqlite3文件,再点击Test Connection。如果底部提示缺少驱动就装上,然后就OK了,如图所示。

连接db.sqlite3.png

连接成功后应该如下图所示

db.sqlite3连接成功.png

然后就可以进行迁移应用了。

点击底部的Terminal菜单,输入python manage.py migrate

然后会出现一堆后面是OK,就是迁移成功了。

然后在右边的Database中刷新一下,表就都显示出来了。

——————————————————————————————————————————

简单请求实现

下面来说如何实现一个简单的请求:

①注册一个路由:urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello),
]

关于这里面url和path的区别,详见这篇博客:https://blog.csdn.net/weixin_44870139/article/details/105565242

第二个参数:视图函数(views中的函数,没有括号)(添加的时候别忘了 from app import views)

②去views.py实现对应的视图函数(view中的代码不宜过多,常用拆开方法:使用多个APP,详见下文)


from django.shortcuts import render    # 这个是自带的
from django.http import HttpResponse   # 下面写HttpResponse报红需要导入这个(本地导入)


# Create your views here.

def hello(request):                      # 写视图函数,一般写为request
    return HttpResponse('Hello World!')  # 永远记得返回Response。括号内可以是HTML代码来显示HTML页面


然后访问对应的url就可以看到我们写好的Response了。
HelloWorld.png

————————————————————————————————————————

模板配置

Templates模板的两种写法:

①在项目文件夹下新建templates文件夹,右键 Mark Directory as ==> Template Folder 标记为模板文件夹

在里面创建HTML File

这个需要在Settings的TEMPLATES里面的DIRS,写上模板文件夹的目录。尽量写相对路径

'DIRS': [
            os.path.join(BASE_DIR, 'templates'),    # 这里写'DIRS': [BASE_DIR + '/templates']也可以 ],

【在开发中一般使用上面那一种,方便模板的继承和复用】

②在App文件夹下新建templates文件夹,右键 Mark Directory as ==> Template Folder 标记为模板文件夹

在里面创建HTML File

HTML编辑中的快捷方法:创建四个标签:输入ul>li *4 然后按Tab就会自动生成四个标签。

写好之后在view对应的函数中return render(request, "index.html")    # 直接渲染模板文件  (请求, 模板文件名)

然后在Settings的 INSTALLED_APPS 里面注册一下你的app,直接写APP的名字即可。

————————————————————————————————————————

分发路由(优化配置)

python manage.py startapp Two   创建一个叫Two的APP。

创建完就要在settings的INSTALLED_APPS里面加上APP的名字'Two'或者'Two.apps.TwoConfig'(仅限于1.9及以后版本)。

那么如何分发路由呢?在Two里面也创建一个urls.py
from django.conf.urls import url

from Two import views

urlpatterns = [
    url("index/", views.index)
]


然后在Two里面再创建一个views.py(当然,使用Pycharm的话也可以右键创建)

然后在项目的urls里面加上一条 path('Two/', include('Two.urls')),     (上面还要从django.urls里面import include)

然后访问127.0.0.1:8000/Two/index就可以访问到Two里面写的index了

————————————————————————————————————————

models 使用了ORM技术(Object Relational Mapping,对象关系映射)

将业务逻辑和SQL进行了一个解耦合:   object.save()     object.delete()   不用再写SQL语句了。

关系型数据库(DDL)定义。Django中通过models模型定义实现数据库表的定义。

在models.py中继承Django的模型。比如要建一个学生表:

class Student(models.Model):               # 继承Django的模型
    s_name = models.CharField(max_length=16)   # 字符串型,最大长度16
    s_age = models.IntegerField(default=1)    # 整型,默认值为1
    

之后要进行数据库的迁移,在Terminal中输入:

python manage.py makemigrations    # 生成迁移文件

然后再执行迁移:

python manage.py migrate


之后就可以在数据库中开到新增的表了。

然后我们新增一条数据试一下:

def add_student(request):
    student = Student()
    student.s_name = 'Jerry'
    student.save()
    return HttpResponse('添加成功')

打开指定网址就可以增加到数据库中了

也可以查询一下试试(这个是先在后台显示一下):


def get_students(request):
    students = Student.objects.all()
    for student in students:
        print(student.s_name)
    return HttpResponse('Student List')
想要在前台显示的话,首先写一个HTML模板(要留空的地方写俩大括号,里面写名称)


然后rander那里可以Ctrl + P看参数提示,传入context字典

这是修改之后的传参:
def get_students(request):
    students = Student.objects.all()
    for student in students:
        print(student.s_name)
    context = {
        'hobby': 'Play games',
        'students': students,
    }
    return render(request, 'student_list.html', context=context)

还有修改之后的HTML,里面可以写简单的模板语法(如里面的for循环):


<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>学生列表</title>
</head>
<body>

<h2>{{ hobby }}</h2>
<h1>Student List</h1>
<ul>
    {% for student in students %}
        <li>{{ student.s_name }}</li>
    {% endfor %}
</ul>
</body>
</html>
上文的Student.objects.all()是获取了所有对象


我们也可以用Student.objects.get(pk=2)获取单个对象,括号里是条件(当前括号写的是主键为2)

特别要注意,get只能返回一个,没有或者多个符合条件都会引发异常!

修改时直接给获取到的对象的一个属性赋值,赋值之后使用student.save()更新到数据库里面

删除直接delete即可。

student = Student.objects.get(pk=1)
    student.s_name = "Jack"        # 删除的话就写student.delete()
    student.save()


总结:存储:save()   查询:查所有:objects.all()  查单个:objects.get()   更新:基于查好的对象,修改属性然后save()   删除:基于查询的,调用delete()





————————————————————————————————————————

后记:关于Pycharm创建虚拟环境:

inherit global site-packages:勾选上的话代表创建的新项目需要copy一份全局包到虚拟环境。

Make available to all projects:勾选上,表示,当在虚拟环境下安装包的时候,copy一份到全局。

  • 在当前虚拟环境下,通过pip freeze > requirements.txt(名字随意)
  • 在目标服务器上执行,pip install requirements.txt即可
详见https://blog.csdn.net/pfm685757/article/details/108590680


本文作者:赵苦瓜      文章标题: 【点滴记录】Django的初步学习(Django的安装、虚拟环境和Djago的初步配置)
本文地址:https://blog.jixiaob.cn/?post=37
版权声明:若无注明,本文皆为“赵苦瓜のBlog~”原创,转载请保留文章出处。

返回顶部    首页    后花园  
版权所有:赵苦瓜のBlog~    站长: 赵苦瓜    程序:emlog   鲁ICP备20030743号-1   鲁公网安备37048102006726 萌ICP备20222268号    sitemap