启动项目时,设置为0.0.0.0:8000,例如: python manage.py runserver 0.0.0.0:8000
在settings.py中设置: ALLOWED_HOSTS = [“本机IP地址”] 关于:ALLOWED_HOSTS配置作用: ALLOWED_HOSTS是用来设置允许哪些主机访问我们的django后台站点。 如果项目没有部署到远程服务器,且DEBUG = True(线下模式,允许调试),默认 有ALLOWED_HOSTS = [‘localhost’, ‘127.0.0.1’, ‘[::1]’],即默认允许本地主机访问django后台。 如果项目上线部署到远程服务器,那就必须设置allow_host为本地的ipv4(也就是你需要去访问该项目的主机的IP地址),不过地址(设置为"*"也可以,但是不安全,因为所有IP都可以访问),否则本地是无法访问远程的django站点。
远程局域网主机通过 “http://部署django的主机IP地址:端口号” 访问django项目。
django本身对代码的目录结构已经做了规范。 不同模块的代码可以创建不同的app,将对应的代码写在自己的app中。 通过 “python manage.py startapp [app名称]”创建app。 创建生成的app目录中会自动创建常用的代码文件,例如:views.py是写视图代码的文件、tests.py是写单元测试的文件、models.py是写模型的文件等。
开启Debug模式的好处:
代码出错时,在浏览器和pycharm中都会打出详细的错误栈,方便问题排查。修改了代码后,按Ctril+s会自动重启服务。**注:**生产环境中一定要关闭Debug模式,否在会将代码目录泄露,存在安全隐患。关闭后,需要设置ALL OWED_HOSTS,指定哪些IP地址或域名可以访问服务。
url中拼接的查询字符串通过视图函数传入的request参数获取。 如下: http://127.0.0.1:8000/book/?number=100,通过request.GET.get获取参数number。
在url和视图映射中,通过"<参数名称>"定义url中要传递的参数名称,视图函数中使用同名的参数获取该参数。 如下: 访问:http://127.0.0.1:8000/book/100/
url转换器有两个作用:
例如指定了转换器为int时,传入的参数不能通过int转换时会报404,找不到对应的url。
传入的参数不使用url转换器的情况下,视图函数中拿到的url参数默认是字符串,使用url转换器时会转换为整形。
其他转换器: 通过 from django.urls import converters 可以看到django内置的几种转换器以及详细的匹配规则。 **str:**非空的字符串类型。默认的转换器。但是不能包含斜杠。 **int:**匹配任意的零或者正数的整形。到视图函数中就是一个int类型。 **slug:**由英文中的横杠-,或者下划线_连接英文字符或者数字而成的字符串。 **uuid:**匹配uuid字符串。 **path:**匹配非空的英文字符串,可以包含斜杠。
当项目越来越大,接口越来越多时,将所有的url和视图函数放在一起不好管理,可以通过按app划分url的形式将urls.py模块化。
在app目录下创建urls.py。
在主urls.py中导入include函数,通过include函数引入app中的子urls.py。 **注意:**由于子urls.py中的url都是以book开头的,所以在主urls.py中写上book/,django会拼接主urls.py和app中子urls.py中的url路径。
在app中的urls.py定义url和视图函数的映射,不需要再写book前缀。
假设在用户没有登录的情况下需要重定向到登录页面: 如下: 访问 http://127.0.0.1:8000/book/时,校验是否参数中的is_login,如果不为True则重定向到/login。 重定向时使用"redirect( [url路径] )", 如果url路径使用硬编码,假设login改为了signin,那么除了urls.py中需要修改,视图函数中也需要修改。 解决这个问题的办法就是给url命名: 在定义url和视图函数映射关系是,可以指明name参数,给url命名。在视图函数中通过 reverse(“url名称”) 拿到实际的url。
在给url命名时,多个app中有可能存在冲突的情况,例如: app1中使用了name1,app2中也使用了name2,就会造成冲突。 解决办法:
在app中的urls.py中定义:应用名称 app_name。使用reverse反转时使用: “app名:url名”。 **注意:**如果这个url中需要传递参数,那么可以通过kwargs来传递参数。示例代码如下: reverse(“cms:login”, kwargs={“id”: 1}) 如果想要添加查询字符串的参数,只能手动的拼接。示例代码如下: reverse(‘cms:login’) + "?next=/"通过使用re_path可以实现一些复杂的url匹配需求。 re_path的参数和path参数一模一样,只不过第一个参数也就是route参数可以为一个正则表达式。
如下图所示: 对于url传入参数的情况,需要用小括号括起来,如果需要指定参数名称则需要用?P<名称>来指定。 语法和re模块语法一致。 **注意:**url字符串要以^开头,$结尾,并且字符串开头要加上r,防止转义。