标签:无法 关系 sql 模版 import 主目录 文件夹 默认路由 中间件
django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制。既然基础已经了解,那就聊聊主流的东西。 一、web框架重新认知: 既然都是框架,那肯定是都包含了这些模块和对应的功能!但是不同框架之间也是有些诧异,毕竟封装的方法不同。 Django: - 路由(url路由系统) - 视图(视图函数) - 模板(模版页面) - 数据库 ---> ORM(类-表;对象-行; pymysql连接数据库) Torando: - 路由 - 视图 - 模板 - 数据库 ---> 自由:pymysql;SqlAchemy Flask: - 路由 - 视图 - 模板(第三方的组件) - 数据库 ---> 自由:pymysql;SqlAchemy 数据库:操作数据库就两种选择:ORM框架或是原生sql,对于复杂的sql语句,ORM框架是无法实现的,还需要去写原生的sql语句去执行。 所以说,对于数据库操作,这连个选择都必须要会。 二、django创建项目及目录设置操作: 有关django创建新项目的操作,已经在基础中提到过了,就不再重申了。由于我是使用pycharm,所以一些正经的操作都会以pycharm为准。 1、创建新项目,创建satic文件,配置settings.py文件,这些操作都略过 2、利用django创建app: (1)pycharm最底下一行是操作行,找到Terminal,点击进入命令行操作窗口。 (2)执行命名:python manage.py startapp app01 - 此处说明一下:首先,创建项目的时候,有个python环境。看准是用什么版本的python创建的。 其次,若电脑装了两个不同版本的python环境,先看自己的python自行程序是否重命名了。由于创建是利用python程序去执行,操作的时候一定要写对! 最后:单环境下,直接执行 上述代码即可完成创建。由于我是双环境,执行创建代码为:python3 manage.py startapp app01 - 再一点注意:可以创建多个app!一个django下可以有多个app(程序)存在! 例如:python3 manage.py startapp app02 (3)创建成功之后,会在当前项目中生成一个名为app***的文件夹,每个文件夹内会有多个py文件。先做如下解释: - app01 - migrations文件夹 用于存放数据库操作日志,不要轻易删除里边的数据 - __init__ 模块执行前先自动加载的文件(学模块是有具体说明) - admin Django自带后台管理相关配置 - apps 保存当前app的一些配置信息 - modal 写类,根据类创建数据库表 - test 单元测试 - views 业务处理 - app02 …… 3、多个不同的app代表不同的业务,分管不同的模块和功能,这样就可以做到对同一框架的协同开发操作。 三、路由系统: url -----> 函数 静态路由:指的是写死的url,对应的某个视图函数的操作!要想看到相对应的模版,还需要手动在浏览器的地址栏中敲,前提是你知道这个url,否则就呵呵了!
基础中写的全是静态路由: /login/ -> def login 动态路由:利用正则去匹配,同时兼顾seo权重的问题(爬虫爬取规则) - seo权重:是搜素引擎匹配的规则 - 注意点:get传参虽然可以实现功能,但是传值的参数会经常变动,同时这种方式的权重太低,及安全性不高! #-------> get传参标志---> ? 为避免这种问题,尽量少用。 - URL 实质还是正则表达式,网页地址栏敲地址,实质上还是在与正则做匹配! 避免get传值: 1. 正则匹配urls页面,此时视图函数就需要再写一个形参,用于接收这个固定url后的值。 - 按位(顺序)传参 /add-user/(\w+)/ -> def add_user(request,a1) --- a1会接收(\w+)匹配传递的值 /add-user/(\w+)/(\w+)/ -> def add_user(request,a1,a2) --a1 是接收第一个,a2是接收第二个 - 此处一定要注意:匹配给视图函数传值;函数在接收的时候,是严格按照顺序接收的! - 指定传参,按照名称传递(不再按照顺序) /add-user/(?P<a1>\w+)/ -> def add_user(request,a1) /add-user/(?P<a1>\w+)/(?P<a2>\w+)/ -> def add_user(request,a1,a2) 注意: 在路由系统中:按顺序传参和指定名称传参不能混用,要不然视图函数无法完成匹配接收。 就是万能的(*args,**kwargs)也无法相对应接收!所以书写的时候一定要统一用法。 顺序传参由:args接收;按照指定名称传参由kwargs接收! PS: 终止符$: - 如果页面没有终止符,那么网址之后就可以任意的写urls或是多个urls拼接在一起,这样也可以访问页面。
但是我们不希望是有这种情况发生,毕竟不同的urls对应着不同的页面,所以urls之后写上终止符,只有写上固定的URL才能访问,其他的都不行。 ^edit$ 伪静态:在urls之后加上.html,伪装成固定的静态网站(特点:速度快!)权重最高! url(r‘^edit/(\w+).html$‘, views.edit), 2. 路由分发:(应用于多个app开发) - 首先明确一点:多个app代表多个不同的业务。 - 用于解决多部门间协同开发同一框架上不同的业务功能模块的方法。 这种机制是让每个业务线操作写路由关系urls的时候互不干预,避免同时操作一个文件倒是url重复的问题! - 路由分发配置: 1、app文件中复制一份urls.py文件,py文件中用于书写当前app的对应关系 2、在项目主目录下mysite的urls.py文件中导入include from django.conf.urls import include 配置: url(r‘^app文件名/‘, include(‘app文件名.urls‘)), #注意:全是字符串格式 示例: urls.py url(r‘^app01/‘, include(‘app01.urls‘)),
app01.urls.py url(r‘^index.html$‘, views.index), PS:执行原理: 把路由匹配分成了两级,先在项目中的urls.py中匹配路由,路由urls指向对应的app文件,然后会在去app文件下的urls.py匹配相对应的url。 3、默认路由:(常用于访问出错,或是路由不匹配的情况下返回的固定信息) - 所有路由都没有匹配成功,再执行的路由关系,返回固定的提示或是固定的某个页面 示例: from app01 import views from django.shortcuts import HttpResponse def default(request): return HttpResponse(‘哥们,走错了。。‘)
url(r‘^‘,default ),#返回固定的提示! views.py def index(request): return render(request,"index.html")
url(r‘^‘, views.index), #返回默认页面 4、命名:用于根据名字反向生成url (最大特点:可以通过名字反向生成url,用以应对 书写或是存储 复杂或是长的 路径) - 给urls.py文件中的对应关系,命名 name = "xxx" /add-user/(\d+)/ -> def add_user(request,a1) name=n1 根据名称可以反向生成URL 1. 在Python代码中 :通过request 和参数反生成url
from django.urls import reverse def add_user(request,a1) v = reverse(‘n1‘, args=xxx, #对应顺序传参 kwargs={‘a1‘:1111} #对应按位传参 #为url传值,生成新的url,想获取什么url就获取什么url 两种方式二选一 ) print(v) return render(request,"index.html") 浏览器地址栏:127.0.0.1:8000/index/123 后台拿到的v: index/1111 2. 在模版页面中,也可以根据名称反生成url(视图函数中不用传值,也不用返回值) - 没有参数的情况: 视图函数中: def login(request) return reder(request,"login.html") 模版文件中: url(r‘^login/‘, views.login,name=‘m1‘) {% url "m1" %} - 有参数,传值: 视图函数中: def login(request,a1(*args)) return reder(request,"login.html") 模版文件中: url(r‘^login/‘, views.login,name=‘m1‘) {% url "m1" 值 %} #按照顺序传值 单个值 {% url "m1" 值1 值2 %} #按照顺序传值 多值 #写值的时候,一定要注意空格! 五、ORM操作:关系对象映射操作数据库! django的ORM没法直接连接数据库,需要利用pymysql第三方工具连接数据库,但是django默认使用MYSQLDB连接mysql,
但是python3中没有MYSQLDB,所以就需要修改django默认连接mysql的方式!
同时,django中默认使用sqlite(文件类型)操作数据库,也需要进行修改! 1、配置数据库: # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 1、如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb() 2、修改与project同名的配置文件settings.py中的DATABASES连接数据库的配置信息: (1)把原来的信息注释掉! (2)写入新的配置信息: DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘:‘s4day70‘, #数据库名称 ‘USER‘: ‘root‘, #账号 ‘PASSWORD‘: ‘‘, #密码 ‘HOST‘: ‘localhost‘, #IP ‘PORT‘: 3306, #端口号 ‘CHARSET‘:‘utf8‘, #字符编码 } } 3、注册app: - 在settings.py文件中的 INSTALLED_APPS 配置信息,最后加上要操作的app文件名以完成注册操作。注意是字符串类型! INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, "app01", ] - 有的会自动添加,不用大惊小怪,检查是否正确就行!
六、django ORM操作:
1、字段及参数:
http://www.cnblogs.com/zh605929205/articles/7103825.html
2、models操作:
http://www.cnblogs.com/zh605929205/articles/7103831.html
七、模版:
http://www.cnblogs.com/zh605929205/articles/7103790.html
八、分页:
http://www.cnblogs.com/zh605929205/articles/7103887.html
九、django的XSS与csrf机制:
http://www.cnblogs.com/zh605929205/articles/7103796.html
十、django之session:
http://www.cnblogs.com/zh605929205/articles/7103775.html
十一、中间件:
参考地址:
http://www.cnblogs.com/wupeiqi/articles/5237704.html
http://www.cnblogs.com/wupeiqi/articles/5246483.html
http://www.cnblogs.com/wupeiqi/articles/6216618.html
标签:无法 关系 sql 模版 import 主目录 文件夹 默认路由 中间件
原文地址:http://www.cnblogs.com/zh605929205/p/7067502.html