zoukankan      html  css  js  c++  java
  • Diango 一——URL

    内容概要

    1.web框架初识

    2.MTV模式

    3.Django创建流程和命令行工具

    4.配置文件  settings

    5.视图函数  views

    6.路由系统  URL

    7.模板系统  template

    8.models(见下一章)


    1.web框架初识                                                                                                

      框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

      最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

    如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

          正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

    这个接口就是WSGI:Web Server Gateway Interface。

    2.MTV模式                                                                               

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

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

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

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

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

    3.Django创建流程和命令行工具                                                                                                           

    (1)创建流程

      略

    (2)常用命令行语句:    

    <1> 创建一个django工程 : django-admin.py startproject mysite

            当前目录下会生成mysite的工程,目录结构如下:

            

      • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
      • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
      • urls.py ----- 负责把URL模式映射到应用程序。

    <2>在mysite目录下创建blog应用: python manage.py startapp blog

            

    <3>启动django项目:python manage.py runserver 8080

           这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

           

    <4>生成同步数据库的脚本:python manage.py makemigrations  

                         同步数据库:  python manage.py migrate   

           注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下

                    的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。            

    <5>当我们访问http://127.0.0.1:8080/admin/时,会出现:

           

           所以我们需要为进入这个项目的后台创建超级管理员:python manage.py createsuperuser设置好用户名和密码后便可登录啦!

    <6>清空数据库:python manage.py  flush

    <7>查询某个命令的详细信息: django-admin.py  help  startapp

           admin 是Django 自带的一个后台数据库管理系统。

    <8>启动交互界面 :python manage.py  shell

         这个命令和直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。

    <9> 终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用

     

    4.Django的配置文件(settings)                                                                                           

      略

     5.Django路由系统(URL)                                                                                              

       URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这个函数,对于那个URL调用那个函数。

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

    参数说明:

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

    5.1 正则匹配:完全匹配、参数、分组

    from django.conf.urls import url
    from django.contrib import admin
    
    from app01 import views
    
    urlpatterns = [
    
        url(r'^articles/2003/$', views.special_case_2003),
    #完全匹配(开头固定、结尾固定)
    
        #url(r'^articles/[0-9]{4}/$', views.year_archive),
    #数字
    
        url(r'^articles/([0-9]{4})/$', views.year_archive), 
    #参数传递,括号包起来的部分回座位参数传递到视图函数
    
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    #分组,?P<year>用于分组,可直接用别名year来调用,()用于传递参数
    ]
    

      

    5.2 url别名及调用方法

    urlpatterns = [
        url(r'^index',views.index,name='alex'),
    #通过name起别名
    
    ]
    ========前端调用方法==========
         <form action="{% url 'alex' %}" method="post">
    
             用户名:<input type="text" name="username">
             密码:<input type="password" name="password">
             <input type="submit" value="submit">
    
         </form>
    

      

    5.3 url映射分发

    from django.conf.urls import include, url
    
    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^blog/', include('blog.urls')),
    #通过include()来分发,将以blog开头的所有url分发给blog下面的urls.py来处理
    ]
    

      

    5.4 CBVFBV

    fbv即视图函数对应函数

    # 方法一:FBV
    
    urs.py
    # url(r'^login.html$', views.login),
    ---------------------------------------------------
    views.py
    
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            c = models.Administrator.objects.filter(username=user,password=pwd).count()
            print(c)
            if c:
                #设置session中存储的数据
                request.session["is_login"] = True
                request.session["username"] = user
                #尤其注意跳转到哪个页面!!!
                return render(request,"index.html",{"username":user})
            else:
                msg = "用户名或密码错误"
                return redirect("/login.html",{"msg":msg})
     
        return render(request,"login.html") 
    
    

    cbv即视图函数对应

    #CBV
    
    urs.py
     
    url(r'^login.html$', views.Login.as_view()),#以类的方式进行创建
    
    -----------------vies.py-------------------
    from django import views
    class Login(views.View):
        def get(self,request,*args,**kwargs):
            return render(request, "login.html")
     
        def post(self,request,*args,**kwargs):
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            c = models.Administrator.objects.filter(username=user, password=pwd).count()
            print(c)
            if c:
                #设置session中存储的数据
                request.session["is_login"] = True
                request.session["username"] = user
                #尤其注意跳转到哪个页面!!!
                return render(request,"index.html",{"username":user})
            else:
                msg = "用户名或密码错误"
                return redirect("/login.html",{"msg":msg})
    

     

    类中用装饰器

     方法一:自定义装饰器

    from django import views
    from django.utils.decorators import method_decorator#1.引入库
    #2.定义装饰器函数
    def outer(func):
        def inner(request,*args,**kwargs):
            print(request.method)
            return func(request,*args,**kwargs)
        return inner
     
    class Login(views.View):
        #3.使用装饰器
        @method_decorator(outer)
        def get(self,request,*args,**kwargs):
            return render(request, "login.html")

    方法二:自定义dispatch方法,同时继承父类该方法,等同于装饰器

    from django import views
     
    class Login(views.View):
        #1.先执行自定义的dispatch方法
        def dispatch(self, request, *args, **kwargs):
            print(11111)
            if request.method == "GET":
                return HttpResponse("ok")
    
            #2.再调用父类中的dispatch方法,dispatch方法类似路由分发
            ret = super(Login,self).dispatch(request, *args, **kwargs)
            print(22222)
            return ret
     
        def get(self,request,*args,**kwargs):
            return render(request, "login.html")
     
        def post(self,request,*args,**kwargs):
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            c = models.Administrator.objects.filter(username=user, password=pwd).count()
            print(c)
            if c:
                #设置session中存储的数据
                request.session["is_login"] = True
                request.session["username"] = user
                #尤其注意跳转到哪个页面!!!
                return render(request,"index.html",{"username":user})
            else:
                msg = "用户名或密码错误"
                return redirect("/login.html",{"msg":msg})
    

     

    6.Django的视图函数views                                                                  

    1 HttpRequest对象的属性和方法:

    path:       请求页面的全路径,不包括域名
    
    method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
     if  req.method=="GET":
    
            do_something()
    elif req.method=="POST":
    
            do_something_else()
    GET:         包含所有HTTP GET参数的类字典对象
    
    POST:       包含所有HTTP POST参数的类字典对象服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过HTTP POST方法提交请求,但是表单中可能没有数据,
    因此不能使用if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"

    2 HttpResponse对象:

      对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。

      HttpResponse类在django.http.HttpResponse

      在HttpResponse对象上扩展的常用方法:

    1
    2
    3
    页面渲染:         render()(推荐)                 render_to_response(),
    页面跳转:         redirect("路径")
    locals():    可以直接将函数中所有的变量传给模板

    3 参数传递及调用

    views.py
    
    def login(request):
        name=‘mary’
        ..........
         
        return render(request,"login.html",{‘name’:name})
    #传递参数
    --------------login.html-----------------
    <div>{{name}}</div>
    #接收参数

     7.模板系统 template                                                                                                

       将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式。

    一、模板组成

        组成:HTML代码+逻辑控制代码

    二、逻辑控制代码的组成

    1.变量:

    语法格式:       {{var_name}}

           万能的句点号 来传递索引、属性、键值等

           变量的过滤器(filter)的使用

                  语法格式:      {{obj|filter:param}}

    2. 标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

    格式:{% tags %}

    if语句

    {% if %}……{% endif %}

    for语句

      {% for %}……{% endfor %}

    等等

    3 自定义filter和simple_tag

    1.新建templatetags文件夹,里面建**.py文件(如tags.py)
    2.tags.py中调用装饰器@decorator.simple_tag 来装饰函数(如函数为render_table_row)
    3、在settings.py中INSTALLED_APPS中加上该app的名字
    4、在**.html文件中,先加载该标签,{% load tags %}
        ,再调用该函数{% render_table_row  参数1 参数2 %}
    
        也可{% render_table_row  参数1 参数2 as_row %}将结果传递给as_row,通过他来调用结果
    

    4. extend模板继承

    参考博客:

    http://www.cnblogs.com/yuanchenqi/articles/6083427.html

    武sir:ORM、SQLAchemy

    http://www.cnblogs.com/wupeiqi/articles/5699254.html

  • 相关阅读:
    mysql 之 double( totalsize, decimal)
    java8 实战--- Map merge用法
    java8 stream接口 终端操作 min,max,findFirst,findAny
    tinyint(1)详解
    表单插件——form
    表单验证插件——validate
    使用ajaxStart()和ajaxStop()方法
    使用ajaxSetup()方法设置全局Ajax默认选项
    使用ajax()方法加载服务器数据
    使用serialize()方法序列化表单元素值
  • 原文地址:https://www.cnblogs.com/tangtingmary/p/7921678.html
Copyright © 2011-2022 走看看