Python Django 2

MVC和MTV

1中所说的就是著名的MVC模式:

所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。

模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。

Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表:

       Model(模型):负责业务对象与数据库的对象(ORM)

       Template(模版):负责如何把页面展示给用户

       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

       此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template。

用Pycharm创建Django项目

如果用的是免费的社区版,是不自带Django的,需要用类似导入新包的方法,用pip3从网上下载Django,然后创建新项目

之后再用Pycharm打开这个项目,

如果用的是收费的专业版,就可以在创建项目时直接选择创建Django项目,这里主要讲专业版的用法。

Django项目创建完毕后,点击Pycharm左下角的

打开隐藏的栏

选择Terminal进入终端,如果想运行起Django,就输入命令python manage.py runserver 8000

如果想创建一个新的App,例如blog,就输入命令python manage.py startapp blog

Django URLS分发器

其实和1中写的微型分发器的主要功能是一样的,就是将发送过来的URLS分发到相应的函数去处理

不过Django的分发器功能更强大就是了,

Django的分发器在urls.py文件中

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

参数说明:

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

一般我们将views视图函数写到对应app的views中,这样有利于分开管理,不至于堆叠在一起,因为是其他包中的文件

所以我们要先导入views文件

from blog import views

这里问题来了,blog和mysite是同级文件,它是如何找到blog并将views导入其中的呢?(因为py导入模块时是存在一个搜索路径的,可以打印sys.path查看此路径,这是一个列表,里面存放着搜索路径,一般会继承环境变量,还有当前目录,所以与之用、同级或者父级的目录都是寻找不到的)

打开settings

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

.py我们会发现这样一个变量BASE_DIR,他实际就是父级的父级目录,有了它我们append入path中就可以找到了。

下面举几个例子一一说明这几个参数。

from django.http import HttpResponse
def indexfunc(request):
    print("Index")
    return HttpResponse("Ready")




from blog import views
from django.conf.urls import url
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r"^index",views.indexfunc),
]

执行分发函数时会默认传入一个request参数,里面封装了请求消息,所以views里面写个形参接收它

注意还要导入相应的模块

url(r"^index",views.indexfunc,{"arg1":1,"arg2":2})
#第三个参数可以传入额外的参数


def indexfunc(request,arg1,arg2):
    print("Index")
    print(arg1)
    print(arg2)
    return HttpResponse("Ready")

这个例子用url的第三个参数以关键字的形式传参。

第四个参数name:
对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。举个例子,因为你的路由转发URL会随着后端的调整而不断变化,而前端在写需要提交到路由系统的页面时需要和你配合好,如果采用别名的话,只需要和前端约定一下就好了。

url(r"login",views.loginfunc,name = "bieming"),



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{% url 'bieming' %}" method="post">
    用户名:<input type="text" name ="username">
    密码:<input type = "text" name = "password">
    <input type = "submit" value = "submit">
</form>
</body>
</html>



def loginfunc(req):
    if req.method =="POST":    #注意此处要大写!!
        username = req.POST.get("username")
        password = req.POST.get("password")
        if username == "R0" and password == "123":
           return  HttpResponse("hello")
    return render(req,"login.html")

render函数就是渲染并传回一个页面,会将模板渲染成最终的HTML文件

第一个参数中正则表达式也可以传参数,在正则表达式中有分组,这里就会以组名为参数名传组

URL还可以分级转发,将用户发来的URL路径分发给下级URL转发器转发,需要用到include函数

先在对应App下创建urls.py文件

#blog/urls.py

from django.urls import path
from blog import views
from django.conf.urls import url,include

urlpatterns = [
    url(r"^index",views.indexfunc,{"arg1":1,"arg2":2}),
    url(r"login",views.loginfunc,name = "bieming"),
]

#urls.py
#url(r"blog/",include("blog.urls")),

猜你喜欢

转载自blog.csdn.net/qq_36428237/article/details/81168428