Django基础--4

补充知识-路由系统(URL)

URL传递额外的参数

在url.py里,除了默认会传一个request给处理函数,还可以传递额外的参数,把一个字典作为第三个参数传入,之后就可以在处理函数里取到对应的值:

from django.urls import path
from app01 import views

urlpatterns = [
    path('index/', views.index, {'foo': 'bar'}),
]

处理函数views.py:

from django.shortcuts import HttpResponse

def index(request, foo):
    return HttpResponse(foo)

命名空间

做路由分发的时候,可以把两条路由指向同一个app,像这样:

在day21的urls.py中

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include("app01.urls",namespace="app01")),
    path('app/', include("app01.urls",namespace="app")),
]
 app01\urls.py
from django.urls import path
from app01 import views

app_name = "app01"

urlpatterns = [ path('index1/', views.index1,name='index1'), path('home1/', views.home1,name='home1'), ]

这里的 include() 里多了一个参数 namespace

现在我们访问网页发现访问 http://127.0.0.1:8000/app01/index1/ 和 http://127.0.0.1:8000/app/index1/ 页面效果,

这里就需要我们做路由分发,以区分。这里是从views反向查找的时候会用到

这里之前出来了一个大坑:

在app01里面的urls.py中少了一行代码,造成一直报错

File "D:\Python34\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include()
 without providing an app_name is not supported. Set the app_name attribute in t
he included module, or pass a 2-tuple containing the list of patterns and app_na
me instead.

解决办法

在app01/urls.py中增加

app_name = "app01"

下面是在处理函数 views.py 以及html页面文件处理路由的问题

def home1(request):
    v = reverse('app01:home1')  # 这个v就是请求的路由,app01为命名空间            /app01/home1/
    return HttpResponse(v)

HTML中处理为

<div>{% url 'app01:index1' %}</div>    //app01:index1   命名空间:url名字

查看请求的其他信息

用户发来请求的时候,不仅有数据,还有请求头

所有的信息都封装在了request这个对象里,现在就把他们找出来。先用下面的处理函数打印出request这个对象:

def index1(request):
    print(type(request))
    return HttpResponse("OK")

打印结果如下:

<class 'django.core.handlers.wsgi.WSGIRequest'>

我们导入上面的模块

from django.core.handlers.wsgi import WSGIRequest

按住ctrl,并点击WSGIRequest,可以看到一个参数,现在我们打印这个参数看看

print(request.environ)

结果为:

{'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\ZYP\\AppData\\Roaming', 'ASL.LOG': 'Destination=file', 'COMMONPROGRAMFILES': 'C:\\Program Files (x86)\\Common Files', 

'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'ZYP-PC', 'COMSPEC': 'C:\\windows\\system32\\cmd.exe',

'DJANGO_SETTINGS_MODULE': 'day21.settings', 'ERLANG_HOME': 'd:\\Program Files\\erl9.3', 'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\ZYP',

'IBM_JAVA_OPTIONS': '-Xrunjvmhook -Xbootclasspath/a:D:\\HP\\QUICKT~1\\bin\\JAVA_S~1\\classes;D:\\HP\\QUICKT~1\\bin\\JAVA_S~1\\classes\\jasmine.jar', 'JAVA_TOOL_OPTIONS': '-agentlib:jvmhook',
'LOCALAPPDATA': 'C:\\Users\\ZYP\\AppData\\Local', 'LOGONSERVER': '\\\\ZYP-PC', 'LSERVRC': 'C:\\ProgramData\\HP\\Functional testing\\License\\lservrc',
'MOZ_PLUGIN_PATH': 'D:\\software\\foxit reader\\Foxit Reader Plus\\plugins\\', 'MSJAVA_ENABLE_MONITORS': '1', 'NUMBER_OF_PROCESSORS': '4', 'OS': 'Windows_NT',
'PATH': 'C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\2.0\\bin\\x86;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\2.0\\bin\\x64;D:\\HP\\QuickTest Professional\\bin;C:\\Program Files (x86)\\Calibre2\\;C:\\driver;C:\\Program Files (x86)\\SecureCRT;D:\\Python\\Python36-32\\Scripts;"C:\\Program Files\\JetBrains\\PyCharm 2018.1.4\\bin\\pycharm64.exe";C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin;C:\\Program Files (x86)\\Git\\cmd;C:\\Program Files (x86)\\IDM Computer Solutions\\UltraEdit;C:\\Program Files\\IDM Computer Solutions\\UltraCompare;D:\\Python\\Python36-32\\Scripts;D:\\Python\\Python36-32\\Scripts\\;D:\\Python\\Python36-32\\;C:\\Users\\ZYP\\AppData\\Local\\Programs\\Fiddler',

'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'x86', 'PROCESSOR_ARCHITEW6432': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 42 Stepping 7, GenuineIntel',

'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '2a07', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files (x86)', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files',

'PSMODULEPATH': 'C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '1', 'PYCHARM_MATPLOTLIB_PORT': '55790', 'PYTHONIOENCODING': 'UTF-8',
'PYTHONPATH': 'C:\\Program Files\\JetBrains\\PyCharm 2018.2.4\\helpers\\pycharm_matplotlib_backend;C:\\Users\\ZYP\\PycharmProjects\\day21', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console',

'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\windows', 'TEMP': 'C:\\Users\\ZYP\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ZYP\\AppData\\Local\\Temp', 'USERDOMAIN': 'ZYP-PC', 'USERNAME': 'ZYP',

'USERPROFILE': 'C:\\Users\\ZYP', 'WINDIR': 'C:\\windows', 'WINDOWS_TRACING_FLAGS': '3', 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', '_CLASSLOAD_HOOK': 'jvmhook',
'_JAVA_OPTIONS': '-Xrunjvmhook -Xbootclasspath/a:D:\\HP\\QUICKT~1\\bin\\JAVA_S~1\\classes;D:\\HP\\QUICKT~1\\bin\\JAVA_S~1\\classes\\jasmine.jar', 'RUN_MAIN': 'true', 'SERVER_NAME': 'genuine.microsoft.com',

'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET',
'PATH_INFO': '/app01/index1/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '127.0.0.1:8000', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_DNT': '1', 'HTTP_CONNECTION': 'keep-alive',

'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_PRAGMA': 'no-cache', 'HTTP_CACHE_CONTROL': 'no-cache', 'wsgi.input': <_io.BufferedReader name=168>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0),

'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}

字典的输出形式为

    for i ,j in request.environ.items():
        print(i,j)

结果为:

ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\ZYP\AppData\Roaming
ASL.LOG Destination=file
COMMONPROGRAMFILES C:\Program Files (x86)\Common Files
COMMONPROGRAMFILES(X86) C:\Program Files (x86)\Common Files
COMMONPROGRAMW6432 C:\Program Files\Common Files
COMPUTERNAME ZYP-PC
COMSPEC C:\windows\system32\cmd.exe
DJANGO_SETTINGS_MODULE day21.settings
ERLANG_HOME d:\Program Files\erl9.3
FP_NO_HOST_CHECK NO
HOMEDRIVE C:
HOMEPATH \Users\ZYP
IBM_JAVA_OPTIONS -Xrunjvmhook -Xbootclasspath/a:D:\HP\QUICKT~1\bin\JAVA_S~1\classes;D:\HP\QUICKT~1\bin\JAVA_S~1\classes\jasmine.jar
JAVA_TOOL_OPTIONS -agentlib:jvmhook
LOCALAPPDATA C:\Users\ZYP\AppData\Local
LOGONSERVER \\ZYP-PC
LSERVRC C:\ProgramData\HP\Functional testing\License\lservrc
MOZ_PLUGIN_PATH D:\software\foxit reader\Foxit Reader Plus\plugins\
MSJAVA_ENABLE_MONITORS 1
NUMBER_OF_PROCESSORS 4
OS Windows_NT
PATH C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;D:\HP\QuickTest Professional\bin;C:\Program Files (x86)\Calibre2\;C:\driver;C:\Program Files (x86)\SecureCRT;D:\Python\Python36-32\Scripts;"C:\Program Files\JetBrains\PyCharm 2018.1.4\bin\pycharm64.exe";C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\IDM Computer Solutions\UltraEdit;C:\Program Files\IDM Computer Solutions\UltraCompare;D:\Python\Python36-32\Scripts;D:\Python\Python36-32\Scripts\;D:\Python\Python36-32\;C:\Users\ZYP\AppData\Local\Programs\Fiddler
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE x86
PROCESSOR_ARCHITEW6432 AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 2a07
PROGRAMDATA C:\ProgramData
PROGRAMFILES C:\Program Files (x86)
PROGRAMFILES(X86) C:\Program Files (x86)
PROGRAMW6432 C:\Program Files
PSMODULEPATH C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC C:\Users\Public
PYCHARM_HOSTED 1
PYCHARM_MATPLOTLIB_PORT 55790
PYTHONIOENCODING UTF-8
PYTHONPATH C:\Program Files\JetBrains\PyCharm 2018.2.4\helpers\pycharm_matplotlib_backend;C:\Users\ZYP\PycharmProjects\day21
PYTHONUNBUFFERED 1
SESSIONNAME Console
SYSTEMDRIVE C:
SYSTEMROOT C:\windows
TEMP C:\Users\ZYP\AppData\Local\Temp
TMP C:\Users\ZYP\AppData\Local\Temp
USERDOMAIN ZYP-PC
USERNAME ZYP
USERPROFILE C:\Users\ZYP
WINDIR C:\windows
WINDOWS_TRACING_FLAGS 3
WINDOWS_TRACING_LOGFILE C:\BVTBin\Tests\installpackage\csilogfile.log
_CLASSLOAD_HOOK jvmhook
_JAVA_OPTIONS -Xrunjvmhook -Xbootclasspath/a:D:\HP\QUICKT~1\bin\JAVA_S~1\classes;D:\HP\QUICKT~1\bin\JAVA_S~1\classes\jasmine.jar
RUN_MAIN true
SERVER_NAME genuine.microsoft.com
GATEWAY_INTERFACE CGI/1.1
SERVER_PORT 8000
REMOTE_HOST 
CONTENT_LENGTH 
SCRIPT_NAME 
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE WSGIServer/0.2
REQUEST_METHOD GET
PATH_INFO /app01/index1/
QUERY_STRING 
REMOTE_ADDR 127.0.0.1
CONTENT_TYPE text/plain
HTTP_HOST 127.0.0.1:8000
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGE zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
HTTP_ACCEPT_ENCODING gzip, deflate
HTTP_DNT 1
HTTP_CONNECTION keep-alive
HTTP_UPGRADE_INSECURE_REQUESTS 1
HTTP_PRAGMA no-cache
HTTP_CACHE_CONTROL no-cache
wsgi.input <_io.BufferedReader name=168>
wsgi.errors <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
wsgi.version (1, 0)
wsgi.run_once False
wsgi.url_scheme http
wsgi.multithread True
wsgi.multiprocess False
wsgi.file_wrapper <class 'wsgiref.util.FileWrapper'>

其中  HTTP_USER_AGENT     通过这个信息可以知道用户是用什么终端发来的请求,可以知道用户用的是iPhong还是用安卓系统。还可以判断用户是手机端就发回给一个手机端的页面。如果是PC端就返回一个PC端的页面。这是一个字典,用 request.environ['HTTP_USER_AGENT'] 就可以获取到这个信息了

上面的输出有这个内容,这里我们再打印出来看下

print(request.environ['HTTP_USER_AGENT'])

结果为:

HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0

模板的继承-extends

方法:

  将要改变的内容用black包起来,不动的部分继承模板即可

先写一个模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} 这里表示标签可变{% endblock %}</title> 
    <link rel="stylesheet" href="/static/comments.css"></link>
    {% block css %} 这里既可以继承模板的css,也可定义自己的css{% endblock %}
</head>
<body>
    <div class="head">后台管理系统</div>
    <div class="left">
        <a class="menu" href="/ORM/user_info/">用户管理</a>
        <a class="menu" href="/ORM/user_group/">用户组管理</a>
    </div>
    <div class="right">
        {% block content %}
            <span>这里编写变化的内容</span>
        {% endblock %}
    </div>
    <script src="/static/jquery-3.2.1.min.js"></script>
    {% block js %} 这里既可以继承模板的js,也可定义自己的js{% endblock %}
</body>
</html>

现在我们来写第一个继承模板的页面

先要声明是继承那个模板

然后定义自己的内容,标题,等信息

{% extends 'demo.html' %}
user_info.html页面

{% extends 'demo.html' %}
{% block title %}用户信息{% endblock %}
{% block content %}
<p>用户信息</p>
{% for i,j in dic.items %}
<p>{{ i }}:{{ j }}</p>
<p>{{ dic.username }}</p>
{% endfor %}

{% endblock %}

注意css(style标签)和js(script标签),一般也都会需要追加css样式和js。css就接在模板的css后面写,js就还是写在最后的位置,如果有jQuery,必须要在导入jQuery静态文件的后面。
只能继承一个模板,不能继承多个。

模板的导入-include

先写个tag.html

<form>
    <input type="text" />
    <input type="submit" />
</form>

然后我们在user_info.html中使用include

{% extends 'demo.html' %}
{% block title %}用户信息{% endblock %}
{% block content %}
    <p>用户信息</p>
    {% for i,j in dic.items %}
        <p>{{ i }}:{{ j }}</p>
        <p>{{ dic.username }}</p>
    {% endfor %}
    {% include "tag.html" %}
    {% include "tag.html" %}
{% endblock %}

上面的例子中看到了,模板的导入可以导入多次的。实际的应用中可能会结合模板语言的for循环,每条数据都通过这个组件渲染然后输出到页面。

 

猜你喜欢

转载自www.cnblogs.com/Aline2/p/10273828.html