django学习笔记
django学习笔记
通过django-admin创建django项目
- 进入要创建项目的目录;
- 进入虚拟环境;
- 执行:django-admin startproject [项目名称]
运行项目
- 命令行:
进入django项目根目录执行:python manage.py runserver [指定端口号]
默认是绑定的8000端口,可以自定义端口号。
- pycharm专业版:
通过专业版pycharm创建
让局域网内的主机访问项目
-
启动项目时,设置为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项目。
创建APP
django本身对代码的目录结构已经做了规范。 不同模块的代码可以创建不同的app,将对应的代码写在自己的app中。
通过 “python manage.py startapp [app名称]”创建app。
创建生成的app目录中会自动创建常用的代码文件,例如:views.py是写视图代码的文件、tests.py是写单元测试的文件、models.py是写模型的文件等。
Debug模式
开启Debug模式的好处:
- 代码出错时,在浏览器和pycharm中都会打出详细的错误栈,方便问题排查。
- 修改了代码后,按Ctril+s会自动重启服务。
**注:**生产环境中一定要关闭Debug模式,否在会将代码目录泄露,存在安全隐患。关闭后,需要设置ALL OWED_HOSTS,指定哪些IP地址或域名可以访问服务。
URL与视图
URL与视图函数的映射
- 创建app book:
- 在app中写视图函数:
(1)视图函数返回值必须是HttpResponseBase或HttpResponseBase的子类。
(2)视图的第一个参数永远都是request(一个HttpRequest)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。
- 在urls.py中声明url和视图函数的映射关系:
自定义urls.py路径
- 为什么django会去urls.py中找url和视图的映射关系?
在settings.py中配置了ROOT_URLCONF指向了urls.py,可以自定义。
- urlpatterns变量的作用:
在urls.py文件中有一个urlpatterns变量,django会从这个变量中读取所有的匹配规则。
url和视图函数的匹配规则需要使用django.urls.path或django.urls.re_path函数进行包裹,这个函数会根据传入的参数返回URLPattern或者是URLResolver的对象。
获取URL中的参数
查询字符串
url中拼接的查询字符串通过视图函数传入的request参数获取。
如下: http://127.0.0.1:8000/book/?number=100,通过request.GET.get获取参数number。
URL中的参数
在url和视图映射中,通过"<参数名称>"定义url中要传递的参数名称,视图函数中使用同名的参数获取该参数。
如下:
访问:http://127.0.0.1:8000/book/100/
URL转换器
url转换器有两个作用:
-
例如指定了转换器为int时,传入的参数不能通过int转换时会报404,找不到对应的url。
-
传入的参数不使用url转换器的情况下,视图函数中拿到的url参数默认是字符串,使用url转换器时会转换为整形。
-
其他转换器:
通过 from django.urls import converters 可以看到django内置的几种转换器以及详细的匹配规则。
**str:**非空的字符串类型。默认的转换器。但是不能包含斜杠。
**int:**匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
**slug:**由英文中的横杠-,或者下划线_连接英文字符或者数字而成的字符串。
**uuid:**匹配uuid字符串。
**path:**匹配非空的英文字符串,可以包含斜杠。
URL 模块化
当项目越来越大,接口越来越多时,将所有的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前缀。
Url命名及反转
假设在用户没有登录的情况下需要重定向到登录页面:
如下: 访问 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
通过使用re_path可以实现一些复杂的url匹配需求。
re_path的参数和path参数一模一样,只不过第一个参数也就是route参数可以为一个正则表达式。
如下图所示:
对于url传入参数的情况,需要用小括号括起来,如果需要指定参数名称则需要用?P<名称>来指定。 语法和re模块语法一致。
**注意:**url字符串要以^开头,$结尾,并且字符串开头要加上r,防止转义。