django-url&view&模板

urls
  • 根目录下引用urls示例代码

    urlpatterns = [
        django.urls.path('arch/', django.urls.include('architecture.urls')),
    ]
    
  • app下urls示例代码

    import django.urls
    
    import architecture.views
    import architecture.views_interact
    
    app_name = 'architecture'
    
    urlpatterns = [
        django.urls.path('insert-app/', architecture.views_interact.insert_app, name='insert_app'),
        django.urls.path('insert-edge/', architecture.views_interact.insert_edge, name='insert_edge'),
        django.urls.path('del-app-or-edge/', architecture.views_interact.del_app_or_edge, name='del_app_or_edge'),
    
        django.urls.path('nav/', architecture.views.nav, name='nav'),
        django.urls.path('network/<str:biz_link>/', architecture.views.test_network, name='network'),
    ]
    
  • url中传变量有两种方式,一种是 network/<str:biz_link>/,biz_link是参数名,需要在view函数声明传入参数,一种是可以直接在url中不显式声明,如url为127.0.0.1:8000/arch/network/?biz_link=test,此时biz_link不必显式声明,view函数中使用request.GET.get("biz_link", "")来获取

  • name,以{app_name:name}可以唯一标识一个app下的一个url,

    • 在模板中使用:{% url 'name' 参数 %}
    • 在views、models中使用:django.urls.reverse('architecture:network', args=("test", )),得到的url为 /arch/network/test/,django.http.HttpResponseRedirect(url)可以重定向到url
views
  • views一般返回两种形式,一种是纯数据,一种是渲染后的html代码,若是前后端分离的话,基本接口都以返回json数据为主

  • 返回渲染后视图示例

    def nav(request: django.http.HttpRequest) -> django.http.HttpResponse:
        links = [app['biz_link'] for app in
              architecture.models.App.objects.using('arch').values('biz_link').distinct()]
    
        ctx = dict(
            links=links,
        )
    
        return django.shortcuts.render(
            request=request,
            context=ctx,
            template_name='architecture/nav.html',
        )
    

    context为传入参数,字典形式,key值是在模板中能使用的名字,template_name是html文件路径,相对路径,路径设置与settings内对模板文件设置有关

    这种形式一般以get方法为主,直接提供用户浏览网页信息

  • 返回数据示例

    def insert_app(request: django.http.HttpRequest) -> django.http.HttpResponse:
        if request.method != 'POST':
            return django.http.JsonResponse(data=dict(code=http.HTTPStatus.METHOD_NOT_ALLOWED))
    
        app_name = request.POST.get('name', '')
        app_type = request.POST.get('type', '')
        content = request.POST.get('content', '')
        link = request.POST.get('link', '')
        if app_name:
            try:
                obj = architecture.models.App(app_name=app_name, biz_link=link, app_type=app_type, content=content)
                obj.save(using='arch')
                return django.http.JsonResponse(data=dict(id=obj.id, code=http.HTTPStatus.OK), safe=False)
            except django.db.utils.IntegrityError:
                return django.http.JsonResponse(data=dict(err="already exists", code=http.HTTPStatus.BAD_REQUEST), safe=False)
        else:
            return django.http.JsonResponse(data=dict(err="need app_name", code=http.HTTPStatus.BAD_REQUEST), safe=False)
    

    这个函数其实主要是对数据库进行了操作,所以用了post方法,这种一般挺容易有出错的,还是要多备好各种情况的返回信息

    JsonResponse中的data是直接返回的字典,即return django.http.JsonResponse(data=dict(err="need app_name", code=http.HTTPStatus.BAD_REQUEST), safe=False)这一段返回的信息为

    {
        "err": "need app_name",
        "code": 400,
    }
    
模板
  • 模板是django内极为强大的一个模块,极快加速了django轻量web开发

  • {% load static %} 加载静态路径,使得可以在模板中以相对路径导入js和css,以url访问静态资源加载

    <script src="{% static 'network/bootstrap-dialog.min.js' %}"></script>
    <link rel="stylesheet" href={% static 'network/bootstrap-dialog.css' %}>
    

    还有load admin_urls等

  • {% include “xxx.html” %} 将某个html文件完全包含进来,extends表示继承,子文件可重写父文件的各个block

  • {% extends "base.html" %}
    {% load admin_urls %}
    
    {% block body %}
        {% include "nav.html" %}
        // 编写单独本页面特有的展示
    {% endblock %}
    
  • 模板中使用变量

    • html中直接使用:{{ param_name }}
    • js中使用:{{ param_name | safe }},且对应views函数传入该变量时,需要以json.dumps(params)的形式
  • 模板中使用python语法

    // 遍历字典
    {% for k, v in param.items%}
    	<li>{{ k }} : {{ v }}</li>
    {% endfor %}
    
    // 遍历数组
    {% for link in links%}
    	<li>{{ link }}</li>
    {% endfor %}
    
    // 以数组下标取值
    {{ links.0 }}
    

    模板中对字典的支持还是有限,若是较为复杂的形式,可以以对象形式传入,模板中直接以obj.param可以调用对象参数,obj.func_name可以获取对象的函数值,故而有时候有些特殊url,也可以在models定义中以函数声明,在模板中可以直接获取某个model对象的函数值

  • 顺便提一下前后端交互部分把,部分接口我是以jquery的ajax实现的前后端交互,示例如下(使用visjs-network中实现删除节点的部分代码)

    $.ajax({
                 url: "/arch/del-app-or-edge/",
                 type: "post",
                 dataType: "json",
                 data: {
                     id: nodeData.nodes[0],
                     type: "app",
                 },
                 headers: {'X-CSRFToken': $.cookie('csrftoken')},
                 success: function (res) {
                     if (res.code === 200) {
                           callback(nodeData);
                           } else {
                                alert(res.err);
                           }
                 },
                 error: function (error) {
                     alert(JSON.stringify(error));
                 }
    })
    

    注意这里的头部是要添加csrftoken解决跨域问题,为此需要在前面引入jquery文件

    <script src="{% static 'network/jquery.cookie.js' %}"></script>
    

    当然还有别的方法解决跨域问题,可自行谷歌测试下。还有一种方法是在views函数加上装饰器@django.views.decorators.csrf.csrf_exempt 这是避免跨域检测,但会降低安全性,但在有些平台可能无法直接在头部加上csrftoken的时候,这个装饰器就有用武之地了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值