python全栈开发基础知识学习——Django框架(一)

Django框架(一)

    • 一、Django简介
      • 1.Django项目文件
      • 2.Django应用文件
      • 3.Django的命令行工具
      • 4.运行开发服务器
    • 二、Django简单运用
      • 1.Django完成一个显示时间
      • 2.对HTML文档进行JQuery渲染
    • 三、Django URL(路由系统)
      • 1.Django如何处理请求
      • 2.Django1版本中
      • 3.Django版本2中
      • 4.路径转换器
      • 5.实现表单数据提交的功能
      • 6.name参数
      • 7..include()实现url分发

python全栈开发基础知识学习——Django框架(一)_第1张图片

一、Django简介

1.Django项目文件

文件名 描述
init.py 告诉Python这是一个什么软件包
urls.py 全局URL配置 ,负责把URL模式映射到应用程序
settings.py 项目相关的配置 ,包括数据库信息,调试标志以及其他一些工作的变量。
manage.py 应用的命令行接口,通过它可以调用django shell和数据库等。
templates文件夹

2.Django应用文件

文件名 描述
init.py 告诉Python这是一个包
urls.py 应用的urls配置文件,这个文件不会像项目的URL.conf那样自动创建
models.py 数据模型
views.py 视图函数(即MVC中的控制器),
tests.py 单元测试

3.Django的命令行工具

命令行 描述
django-admin.py startproject mysite 创建一个Django工程项目名为 mysite
python manage.py startapp blog 在mysite目录下创建blog应用
python manage.py runserver 8080 在本机8080端口启动Django程序
python manage.py makemigrations 生成同步数据库的脚本
python manage.py migrate 同步数据库
python manage.py createsuperuser 为进入这个项目的后台创建超级管理员,并设置用户名和密码
python manage.py flush 清空数据库
django-admin.py help startapp 查询某个命令的详细信息
python manage.py shell 启动交互界面
   注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。   

4.运行开发服务器

Django内置的Web服务器,该服务器运行在本地,专门用于开发阶段。
为什么会存在这个开发服务器?主要有以下几点原因。

  1. 使用开发服务器,可以直接运行与测试项目和应用,无需完整的生产环境。
  2. **当改动Python源码文件并重新载入模块时,开发服务器会自动重新检测。**这样既能节约时间,也能方便地使用系统,无须每次编辑代码后重新手动自启
  3. 开发服务器知道如何为Django管理应用程序寻找和显示静态媒体文件,所以无须立即了解管理方面地内容。

二、Django简单运用

1.Django完成一个显示时间

#template文件夹下的times.html文档



    
    Title


hello index1

hi {{ time }}

---------------------------------------urls.py------------------------------------------------ from blog import views path('show_time/', views.show_time), ------------------------------------blog下的views.py文件------------------------------ import time def show_time(request): t= time.ctime() return render(request,"times.html",{"time":t})

2.对HTML文档进行JQuery渲染

按照我们之前些HTML文档进行渲染时,我们会在HTML文档中引入JQuery文件。

------------------template文件夹下的times的HTML文档



    
    Title


hello index1

{#

hello {{ t }}

#}

hi {{ time }}

通过改方法,我们不难发现,这样并不能将字体颜色调成红色,原因是Django程序无法找到JQuery文件,导致错误。

JS代码是浏览器进行调用的, 当Django程序执行到了return render(request,“times.html”,{“time”:t})方法时,会将t的值赋值给HTML文档的{{time}},然后再将整个HTML文档发给浏览器。
python全栈开发基础知识学习——Django框架(一)_第2张图片
面对该问题,我们之后都会将JS文件和的JQuery文件和图片等等放在一个static文件夹(如果不存在该文件夹,可以自行创建)。该文件夹与应用blog并列,如果我们的项目比较大时,我们可以将static文件夹放在应用blog文件夹下。
为了Django文件能够找到static下的文件,我们还需对其进行配置

STATICFILES_DIRS=(
    os.path.join(BASE_DIR,"static"),
)

注意点:STATICFILES_DIRS是一个元组,每一个元素后面需要加一个逗号。

STATIC_URL = ‘/static/’ 这是一个别名,之后的查找都需要通过别名来查找。

引入Jquery文件还有一个方式,并且推荐使用改方式


    
    {% load staticfiles %}
    Title




三、Django URL(路由系统)

1.Django如何处理请求

当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:

  1. Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则将使用其值代替 ROOT_URLCONF设置。

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

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

  4. 一旦其中一个URL模式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。视图传递以下参数:

    1. 一个例子HttpRequest。
    2. 如果匹配的URL模式未返回任何命名组,则正则表达式中的匹配将作为位置参数提供。
      关键字参数由路径表达式匹配的任何命名部分组成,由或者 可选kwargs参数中指定的任何参数覆盖 。django.urls.path(),django.urls.re_path(),
    3. 如果没有URL模式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。
  5. URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

2.Django1版本中

from django.conf.urls import url

urlpatterns = [
    url(正则表达式, views视图函数,参数,别名),
]


参数说明:

一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数


例子:

urlpatterns = [

    url(r'^articles/2019/$', views.special_case_2019),
	#http://127.0.0.1:8080/article/2019/
	
    url(r'^articles/[0-9]{4}/$', views.year_archive),
	#http://127.0.0.1:8080/article/2019/
	
    url(r'^articles/([0-9]{4})/$', views.year_archive),  #no_named group
	#http://127.0.0.1:8080/article/2019/
	
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
	#http://127.0.0.1:8080/article/2019/08/
	
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    #http://127.0.0.1:8080/article/2019/08/02
    
]

上面的示例使用简单的、未命名的正则表达式组(通过括号)捕获URL的位,并将它们作为位置参数传递给视图。这带来的问题是,在编程时,我们需要确定正则表达式分组元素的位置,否则我们会乱套变量的值。在更高级的使用中,可以使用命名正则表达式组捕获URL位并将它们作为关键字参数传递给视图。
在Python正则表达式中,命名正则表达式组的语法是(?Ppattern),其中name是组的名称,pattern是要匹配的模式。

urlpatterns = [
    url(r'^articles/2019/$', views.special_case_2019),
    #http://127.0.0.1:8080/article/2019/
    url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
    #http://127.0.0.1:8080/article/2019/
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
    #http://127.0.0.1:8080/article/2019/08/
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),
    #http://127.0.0.1:8080/article/2019/08/22/
]

3.Django版本2中


from django.urls import path

urlpatterns = [
   path(route, view, kwargs=None, name=None)
]

参数说明:
该route参数应该是一个字符串或 gettext_lazy(),其中包含一个URL模式。该字符串可能包含尖括号(如上所示)以捕获URL的一部分并将其作为关键字参数发送到视图。尖括号可以包括转换器规范(如int部分),其限制匹配的字符并且还可以改变传递给视图的变量的类型。例如,匹配一串十进制数字并将值转换为a int。

所述view参数是一个视图函数或的结果 as_view()为基于类的视图。它也可以是一个django.urls.include()。

该kwargs参数允许您将其他参数传递给视图函数或方法。


笔记:

要从URL捕获值,请使用尖括号。
捕获的值可以选择包括转换器类型。例如,用于 捕获整数参数。如果未包含转换器/,则匹配除字符之外的任何字符串。
没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles。

----------------------------------------------------------------------------------------------

from django.urls import path

urlpatterns = [
re_path(route, view, kwargs=None, name=None)
]
参数说明:
该route参数应该是一个字符串或 gettext_lazy(),其中包含与Python的兼容的正则表达式re模块。字符串通常使用原始字符串语法(r''),以便它们可以包含序列,\d而无需使用另一个反斜杠转义反斜杠。进行匹配时,将正则表达式中捕获的组传递给视图 - 如果组已命名,则作为命名参数,否则作为位置参数。值以字符串形式传递,不进行任何类型转换。

view,kwargs和name参数与 path()是一样的。

这是一个示例URLconf:

from django.urls import path

from . import views

urlpatterns = [
    path('articles/2019/', views.special_case_2019),

    path('articles//', views.year_archive),

    path('articles///', views.month_archive),

    path('articles////', views.article_detail),

]

示例请求:

  • 127.0.0.1:8080/articles/2005/03/与列表中的第三个条目匹配。Django会调用该函数。views.month_archive(request, year=2005, month=3)

  • 127.0.0.1:8080/articles/2003/将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个是第一个要通过的测试。随意利用订单插入这样的特殊情况。在这里,Django会调用该函数。views.special_case_2003(request)

  • 127.0.0.1:8080/articles/2003 不匹配任何这些模式,因为每个模式都要求URL以斜杠结尾。

  • 127.0.0.1:8080/articles/2003/03/building-a-django-site/将匹配最终模式。Django会调用该函数 。views.article_detail(request, year=2003, month=3, slug=“building-a-django-site”)

4.路径转换器

默认情况下,以下路径转换器可用:

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

5.实现表单数据提交的功能

------------------------------------register.html文件-------------------------------------------------



    
    Title




创建个人信息

姓名:

性别:

-------------------------------------views.py----------------------------------------------- def register(request): if request.method=="POST": print(request.POST) print(request.POST.get("name")) return HttpResponse("OK") return render(request, "register.html") ---------------------------------------urls.py---------------------------------------------- path('register/', views.register)

6.name参数

在views.py上的设计,能够实现一种视图提供两个方法(POST、GET)。
不知道是否还记得urls.path中还有一个参数为name,这个别名参数的应用是很大的。在之后写项目维护的过程中,我们难免会对以创建的视图进行更名操作,但我们不可能总回到所有的文件中修改,这时候就用到了参数name了。


name的作用:

  1. 在url的路由配置中加上一个name的设置的话,在使用到url的路径时,都可以用name的别名代替,减少路由修改和维修的代价

  2. 主要应用在页面重定向

  3. 模板页面的href跳转({% url ‘url_name’ %})

----------------------------------register.html---------------------

    
    {% load staticfiles %}					
    Title


----------------------------------urls.py------------------------------------ path('register/', views.register, name="reg") ----------------------------- views.py------------------------------------- path('registers/', views.registers, name="reg")

这样在访问老的页面时,就会自动跳转到新的页面,不再写入url的路径

name的作用:

name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。
这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。


7…include()实现url分发

在任何时候,您的urlpatterns都可以“包含”其他URLconf模块。这本质上,“根”是一组位于其他url之下的url。
例如,下面是Django网站本身的URLconf的摘录。
它还包括其他一些urlconf:

from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),
]


该意义大概可以理解成,凡是以blog开头的路径,都在blog应用文件夹下的urls进行查找。

你可能感兴趣的:(python全栈学习)