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的时候,这个装饰器就有用武之地了