Django笔记

django 应用部分

查看安装的版本

python -m django --version 会显示版本号

创建项目

打开命令行,cd到一个你想放置代码的目录 然后运行以下命令

$ django-admin startproject mysite(项目名称)

这行代码将会在当前目录下创建一个mysite的目录

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

这些目录和文件的用处是:

  • 最外层的 mysite/ 根目录只是你项目的容器, 根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。
  • manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin 和 manage.py 获取所有 manage.py 的细节。
  • 里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
  • mysite/init.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 更多关于包的知识。
  • mysite/settings.py:Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 Django 配置 了解细节。
  • mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。阅读 URL调度器 文档来获取更多关于 URL 的内容。
  • mysite/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。阅读 如何使用 ASGI 来部署 了解更多细节。
  • mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节。

用于开发的简易服务器

$ python manage.py runserver

会看到如下输出:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

十二月 07, 2021 - 15:50:53
Django version 3.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

更换端口

默认情况下 runserver命令会将服务器设置为监听本机内部IP的8000端口
如果要更换

python manage.py runserver 端口号码

如果你想要其他电脑展示你的成果时使用

python manage.py runserver 0:8000
0是0.0.0.0的简写


创建投票应用

在Django中,每一个应用都是一个python包,并且遵循相同的约定,django自带一个工具,可以帮你生成应用的基础目录结构

项目和vs应用
项目和应用的区别
 	应用是一个专门做某件事的网络应用程序--比如博客系统,或者公共记录的数据库,或者小型的投票系统。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用,应用可以被很多个项目使用

请确定你现在处于 manage.py 所在的目录下,然后运行这行命令来创建一个应用:

$ python manage.py startapp polls(应用名称)

这将会创建一个polls目录,它的目录结构大致如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

这个目录结构包括了投票应用的全部内容。


编写第一个视图

polls/views.py
from django.http import HttpResponse

def index(request):
	return HttpResponse("hello,world.You re at the polls index")


这是Djangou中最简单的视图,如果想看见效果,我们需要将一个url映射到它,这就是我们需要URLconf的原因了。
为了创建URLconf,请在polls目录新建一个urls.py 你的应用目录现在看起应该这样

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

在polls/urls.py中,输入如下代码:

from django.urls import path
from . import views

urlpatterns = [
	path("",views.index,name="index"),

]

下一步是要把URLconf文件中指定我们创建的polls.urls模块 在mysite/urls.py的文件中urlpatterns列表插入一个include( ) 如下

mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

函数include( )允许引用其他的URLconfs。每当Django遇到include( )时候,它会截断此项匹配的URL的部分并将剩余的字符串发送到 URLconf 以供进一步处理。

我们设计 include() 的理念是使其可以即插即用。因为投票应用有它自己的 URLconf( polls/urls.py ),他们能够被放在 “/polls/” , “/fun_polls/” ,"/content/polls/",或者其他任何路径下,这个应用都能够正常工作。
函数path( )具有四个参数,两个必须参数route和view,两个可选参数:kwargs和name。

1 path( )参数:route

route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。


2 path( )参数 view

当jango找到了一个匹配的准则,就会调用这个特点的视图函数,并传入一个HttpRequest对象作为第一个参数,被捕获的参数以关键字参数


3path ( ) kwargs

任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。


#### path() 参数: name( ) 为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。

数据库设置

数据库配置

连接数据库的设置

默认情况下 配置使用SQlite。若不使用SQlite作为数据库,则需要额外设置,例如USER PASSWORD和HOST必须加入
其中ENGINE设置为数据库后端使用内置数据库后端有:
ENGINE – 可选值有

  • ‘django.db.backends.sqlite3’,
  • ‘django.db.backends.postgresql’,
  • ‘django.db.backends.mysql’,
  • ‘django.db.backends.oracle’

在 项目/settings.py文字中,通过DATABASES项目进行数据库设置

DATABASES = {
"default":{
		"ENGINE":"django.db.backends.mysql",
		"NAME":"mydemo",#库名
		"USER":"root",
		 "PASSWORD": "",
		"HOST":"localhost",
		"PROT":"3306",
		}
}

1. MySql驱动

我们使用Django、flask等来操作MySQL,实际上底层还是通过Python来操作的。因此我们想要用Django来操作MySQL,首先还是需要安装一个驱动程序。在Python3中,驱动程序有多种选择。比如有pymysql以及mysqlclient等。
网址地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 下载对应版本 python版本和型号

安装

pip install --user 位置\mysqlclient.whl

2 mysql 创建

在polls 里面的models.py 模块中

class Stu(models.Model):
    #类的属性对应数据库的数据类型
    id=models.AutoField(primary_key=True)
    names = models.CharField(max_length=20)
    def __str__(self):
        return "%d:%s"%(self.id,self.names)
    #自定义对应的表明,默认表名 
    class Meta:
        db_table = "g1"

在myweb中的settings.py中设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "db1",
        "USER":"root",
        "PASSWORD": "",
		"HOST":"localhost",
		"PROT":"3306",
    }
}

INSTALLED_APPS = [
     #写入应用名.apps.PollsConfig
    'polls.apps.PollsConfig',
]

3查看数据库内容

python manage.py shell #打开
from polls.models import Stu #引入类
mod = Stu.objects
mod.get(id) 获取一项
dataall= mod.all( ) for i in dataall: print(i) #获取所有项

在视图views程序中用


from polls.models import Stu #引入模块
mod=Stu.objects
#mod.get( ) 获取单项数据  mod.all( )获取全部数据
print(mod)

### 四 启用网站admin管理 #### 数据迁移 使用这些django自带的应用程序,需要我们在数据中创建一些数据表对应,然后才能使用它们,为此运行以下命令(数据结构迁移) > python manage.py migrate

创建超级用户 管理账号

python manage.py createsuperuser 密码至少8位

修改settings.py的时区和语言

LANGUAGE_CODE = "zh-hans"
TIME_ZONE = "Asia/Shanghai"

将我们自定义的应用程序的加入到后台管理

打开 myapp/amin.py

from polls.models import Stu
admin.site.register(Stu)

更深入的执行

暂时省略


Django的URL路由(URL配置)

一个干净优雅的URL方案是高质量web应用程序中的一个重要细节。
Django可以让你自己设置URL,无论你想要什么,没有框架限制
为了给一个应用设置URL,你需要创建一个python模块,通常被称为URLconf(URLconfiguration)
这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射。

(1) Django是如何处理一个请求

当用户从Django的站点请求页面时,Django系统遵循以下步骤来执行python代码:

  1. 首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入HttpRequest 对象具有urlconf属性(由中间件设置),则其值将用于替换ROOT_URLCONF设置。

  2. Django加载该Python模块并查找该变量 urlpatterns。它是django.urls.path()和(或)django.urls.re_path()实例的序列(sequence)。

  3. Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。

  4. 一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。该视图会获得如下参数:

    • 一个HttpRequest实例。
    • 如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
    • 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖。django.urls.path()、django.urls.re_path()。
  5. 如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。

路径转换器

  • 默认情况下,以下路径转换器可用:
    • str-匹配任何非空字符串,但路径分隔符除外’/’。如果表达式中不包含转换器,则为默认设置。
    • int-匹配零或任何正整数。返回一个int。
    • slug-匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。
    • uuid-匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
    • path-匹配任何非空字符串,包括路径分隔符 ‘/’。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。

通过浏览器访问服务

注意:url路由,由上而下 进行匹配,如果在上面就匹配成功,则不会向下匹配

通过浏览器访问服务
    127.0.0.1:8000/abc ==>  root url(根路由) ==> 加载子路由(myweb/urls.py)

    ==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)

    ==> views.py index() 响应内容

使用正则表达式:

  • 如果路径和转换器语法不足以定义URL模式,则还可以使用正则表达式。为此,请使用re_path()代替path()
  • 在Python正则表达式中,命名正则表达式组的语法为(?Ppattern),其中name是组的名称,并且 pattern是匹配的某种模式。
  • 这是前面的示例URLconf,使用正则表达式重写:
from django.urls import path, re_path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    re_path(r'^articles/(?P[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-]+)/$', views.article_detail),
]
  • 这可以完成与上一个示例大致相同的操作,除了:
    • 将要匹配的确切URL受到更多限制。例如,年份10000将不再匹配,因为年份整数被限制为正好是四位数长。
    • 无论正则表达式进行哪种匹配,每个捕获的参数都将作为字符串发送到视图。
  • 当从使用切换为使用path(),re_path()反之亦然时,特别重要的是要注意视图参数的类型可能会更改,因此您可能需要调整视图。

使用未命名的正则表达式组(不推荐)

  • 除了命名组语法(例如)之外(?P[0-9]{4}),您还可以使用较短的未命名组(例如)([0-9]{4})
  • 不建议特别使用此用法,因为这样可以更轻松地在匹配的预期含义和视图的参数之间意外引入错误。
  • 无论哪种情况,建议在给定的正则表达式中仅使用一种样式。当两种样式混合使用时,任何未命名的组都会被忽略,只有命名的组才会传递到视图函数。

为视图参数指定默认值

  • 一个方便的技巧是为视图的参数指定默认参数。这是一个示例URLconf和视图:
# URLconf
from django.urls import path

from . import views

urlpatterns = [
    path('blog/', views.page),
    path('blog/page/', views.page),
]

# View (in blog/views.py)
def page(request, num=1):
    # Output the appropriate page of blog entries, according to num.
    ...
  • 在上面的示例中,两个URL模式都指向同一视图– views.page–但是第一个模式未捕获URL中的任何内容。
  • 如果第一个模式匹配,该page()函数将使用它的默认参数num,1。
  • 如果第二个模式匹配, page()将使用num捕获的任何值。

(3). 错误处理

当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。

用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。

有关详细信息,请参阅自定义错误视图的文档。

这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。

值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。

变量是:

  • handler400- 见django.conf.urls.handler400。
  • handler403- 见django.conf.urls.handler403。
  • handler404- 见django.conf.urls.handler404。
  • handler500- 见django.conf.urls.handler500。

关于404错误

  • 404的错误页面,在模板目录中创建一个404.html的页面
  • 在配置文件中 settings.py 配置 DEBUG = False
  • 在配置文件中 settings.py 配置 TEMPLATES = [{‘DIRS’: [os.path.join(BASE_DIR,‘templates’)] }]
  • 同时需要在项目的根目录下创建文件夹templates,并且在此目录下创建一个404.html文件
  • 在出现404的情况时,自动寻找404页面。
  • 也可以在视图函数中 手动报出404错误,带提醒信息

在视图函数中也可以指定返回一个404

views.py
注意 Http404需要在django.http的模块中引入
from django.http import Http404
 # 响应404
 raise Http404('纳尼a')
 
 纳尼a会匹配到404.html中的exception 

在模板中 404.html




    404


    

404 not found

{ { exception } }

(4). 包括其他的URLconf

在任何时候,您urlpatterns都可以“包含”其他URLconf模块。

这实质上是将一组网址“植根于”其他网址之下

例如,下面是Django网站本身的URLconf的摘录。它包含许多其他URLconf:

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]
  • 每当Django遇到时include(),它都会截断直到该时间点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf中以进行进一步处理每当Django遇到include()django.urls.include())时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。

(5). URL的反向解析

如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情

  • 解决:在做链接时,通过指向urlconf的名称,动态生成链接地址
  • 视图:使用django.urls.reverse()函数
  • 模板:使用url模板标签

示例

  • 在URLconf中
from django.urls import path

from . import views

urlpatterns = [
    #...
    path('articles//', views.year_archive, name='news-year-archive'),
    #...
]
  • 根据这种设计,对应于年度归档文件的URL NNNN 是/articles//。
  • 您可以使用以下模板代码获取这些:
<a href="{ %   url 'news-year-archive' 2020   % }">2020 Archivea>
{# Or with the year in a template context variable: #}
<ul>
    {% for yearvar in year_list %}
        <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archivea>li>
    {% endfor %}
ul>
  • 在Python代码中:
from django.http import HttpResponseRedirect
from django.urls import reverse

def redirect_to_year(request):
    # ...
    year = 2019
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
  • 或简写
from django.shortcuts import redirect
from django.urls import reverse

def index(request):
    year = 2019
    return redirect(reverse('ews-year-archive',args=(year,)))

Model的开发流程

  1. 在应用的models.py 中定义模型类,要求继承自models.Model
  2. 把应用加入到项目settings.py配置文件的INSTALLED_APPS项中
  3. 生成迁移文件 python manage.py makemigrations
  4. 执行迁移 python manage.py migrate
  5. 使用模型类进行CRUD操作 增删改查
  • 在模型中定义属性,会生成表中的字段
  • django根据属性的类型确定以下信息:
    • 当前选择的数据库支持字段的类型
    • 渲染管理表单时使用的默认html控件
    • 在管理站点最低限度的验证
  • django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
  • 属性命名限制
    • 不能是python的保留关键字
    • 由于django的查询方式,不允许使用连续的下划线

你可能感兴趣的:(django,python,后端)