
阿里云大礼包(https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=66enueqz)
08函数的其他的定义方式.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>08函数的其他的定义方式</title> <script> /** * 命名函数:函数如果有名字,就是命名函数 * * 匿名函数:函数如果没有名字,就是匿名函数 * * 函数的另一种定义方式 * 函数表达式: * 把一个函数给一个变量,此时形成了函数表达式 * var 变量 = 匿名函数; * 例子: * var f1=function (){ * * }; * 如果是函数表达式那么此时前面的变量中存储的就是一个函数,而这个变量就相当于 是一个函数,就可以直接加 * 小括号调用了 * f1(); * * f1即是函数代码块加 (); 就能调用函数 * * 注意: * 函数表达式后面,赋值结束后,要加分号 * * * * * 函数定义: * 1.函数声明--函数定义 * function 函数名(){ * 函数体 * } */ // (function () { // console.log("月色真美!"); // })();//月色真美! //函数的自调用,没有名字,调用---声明的同时,直接调用 //一次性的---- (function(){console.log("月色真美2");})(); var f1=function(){console.log("月色真美2");}; f1(); // //命名函数 // function f1(){ // console.log("哈哈,您又变帅了"); // } // f1();//函数调用 // //如果一个函数能够调用:函数的代码(); // // 匿名函数 // //函数表达式 // var f2=function (){ // console.log("真的真的?"); // }; // //匿名函数不能直接调用 // f2(); // // // var f4=function(){ // console.log("我是一个函数"); // }; // f4(); // //函数声明(如果函数名重名会覆盖,) function f1() { console.log("妹妹教师好帅"); } f1();//姐姐教师好帅(函数重名就执行后一个,后面一个覆盖前面一个) function f1() { console.log("姐姐教师好帅"); } f1();//姐姐教师好帅 // // 函数表达式 var f2=function (){ console.log("助教姐姐好帅"); }; f2();//助教姐姐好帅 f2=function (){ console.log("小助教好帅"); }; f2();//小助教好帅 // var num=10; // console.log(num);//10 // num=100; // console.log(num);//100 </script> </head> <body> </body> </html>
通过DOS编译 提示 错误:编码GBK的不可映射字符 检查: 1、 查本机区域语言设置中文没有问题 2、 此程序可以在eclipse上正常运行 右键properties-resource-text file encoding 查是UTF-8 解决方法: 1、运行是使用javac -encoding UTF-8HelloWorlewww.java 编译通过 2、记事本打开java源文件,另存为选择ANSI编码 编译通过 说明: ANSI:美国国家标准协会,系统预设的标准文字储存格式。简体中文编码GB2312,实际上它是ANSI的一个代码页936 UTF-8:通用字集转换格式,这是为传输而设计的编码,2进制,以8位为单元对Unicode进行编码,如果使用只能在同类位元组内支持8个位元的重要资料一类的旧式传输媒体,可选择UTF-8格式。 在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的),用专门的Unicode处理类可以对UTF编码进行处理。
Path C:\Program Files\Java\jdk1.8.0_131\bin C:\Program Files\Java\jre1.8.0_131\bin CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar JAVA_HOME C:\Program Files\Java\jdk1.8.0_131 win10配置java环境变量,解决javac不是内部或外部命令等问题 今天Win10上配置java环境变量遇到了在cmd命令窗口下,输入java,显示正常,输入java -version 也是显示正常,唯独输入javac,显示“javac不是内部或外部命令,布拉布拉一些的问题”,然后我就开始各种百度各种谷歌,终于在大半夜把这个问题搞定了。。。 下面来说说这个问题的解决办法,其实很简单: 1,首先进入环境变量页面 2,在系统变量下面配置 JAVA_HOME:你自己的jdk的路径CLASSPATH= .;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar 注意前面有一个.千万不要忘了。(注意 如果是1.5以后的JDK版本不需要配置CLASSPATH)第三步,也是最重要的一步,配置Path变量,这里win10和其他的不同就出来了,win的path变量,要用jdk的绝对路径,而不能用%JAVA_HOME%这一类的,计算机识别不了。 这样你在测试一下肯定就没有问题了,还有修改完环境变量,再次测试的时候,cmd的窗口需要重新启动一下
JAVA环境变量配置 我们以win7系统为例,xp下的配置基本一致。 右键单击计算机,点击属性: 配置JAVA_HOME 注意:不要在目录值后面再添加分号,逗号之类的符号! 3. 配置path 修改系统环境变量Path,在最前面追加% JAVA_HOME %bin,并以;和原路径分隔。再增加:“.;”。这是表示当前目录的意思。 classpath问题:如果使用jdk1.5以上就不需要配置这个环境变量!JRE会自动搜索当前路径下的类文件及相关jar文件。 测试安装环境是否安装成功 运行àcmdà输入命令:java –version: 出现如下结果,则通过测试。输入javac,出现如下结果,则通过测试。 4.修改系统环境变量Path,在最前面追加%JAVA_HOME%bin 并以;和原路径分隔。再增加:“.;”。这是表示当前目录的意思。 菜鸟雷区 1.此处一定是英文分号而不是中文分号! 大家以后设置相关配置时也要注意中英文符号的区别。 注:classpath配置问题:如果使用JDK1.5以上就不需要配置这个环境变量!JRE会自动搜索当前路径下的类文件及相关jar文件 进入命令行窗口,开始菜单搜索框输入“cmd”即可,如图1-18所示。在窗口中输入命令“java -version ”,回车。出现如下结果,则说明JDK安装成功。
JDK、JRE、JVM的区别联系 JDK: • Java Development Kit • 针对Java开发员的产品 • JRE: • Java Runtime Environment • 是运行Java程序所必须的环境集合 • JVM • Java Virtual Machine • 解释运行Java字节码文件,跨平台的核心 • 联系:JDK 包含JRE,JRE包含JVM。 Java Runtime Environment (JRE) 包含:Java虚拟机、库函数、运行Java应用程序所必须的文件。 Java Development Kit (JDK)包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JDK、JRE和JVM的关系如图1-7所示。 老鸟建议: ·如果只是要运行Java程序,只需要JRE就可以。JRE通常非常小,其中包含了JVM。 ·如果要开发Java程序,就需要安装JDK。
·使用记事本,编写代码 【示例1-1】使用记事本开发第一个Java程序 public class Welcome{ public static void main(String[] args){ System.out.println("Hello Java!我是JAVA学员"); } } 2、记事本打开java源文件,另存为选择ANSI编码 可在d盘下建立文件夹mycode,用于保存学习的代码。保存路径建议为:”d:/mycode”。保存为:Welcome.java (文件名必须为Welcome,大小写也必须一致)。如图1-19所示。() 菜鸟雷区 1.代码中的引号、分号必须为英文引号和分号,不能是中文全角的引号和分号 2.注意大小写 ·编译(编译器创建class字节码文件) 打开命令行窗口,进入Java文件所在目录;执行命令:javac Welcome.java,生成class文件。 解释并运行阶段 执行:”java Welcome”(就是运行编译生成的Welcome.class文件),输出执行结果。
接着上一课 修改app01\views.py: from django.shortcuts import render,HttpResponse,redirect USER_DICT = { '1': {'name': 'root1', 'email': 'root@live.com'}, '2': {'name': 'root2', 'email': 'root@live.com'}, '3': {'name': 'root3', 'email': 'root@live.com'}, '4': {'name': 'root4', 'email': 'root@live.com'}, '5': {'name': 'root5', 'email': 'root@live.com'}, } def index(request,nid,uid): # indexx print(request.path_info) # /asdfasdfasdf/13/ # reverse 能反转 from django.urls import reverse # v = reverse('indexx', args=(90,88,)) v = reverse('indexx', kwargs={'nid':'1','uid':'99'}) print(v) return render(request, 'index.html', {'user_dict': USER_DICT}) def detail(request, nid): # print(nid, uid) # return HttpResponse(nid) detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info}) def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # 数据表中执行 select * from user where username='x' and password='x' return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png app01\models.py image.png app01\models.py 代码如下: from django.db import models # Create your models here. class UserInfo(models.Model): # Django自动创建id列,自增,主键 # 用户名列,字符串类型,指定长度 username = models.CharField(max_length=32) password = models.CharField(max_length=64) 接着创建表: 先在settings中添加app01如下图: image.png 然后在Terminal中运行输入 (python manage.py makemigrations)[创建表] (python manage.py migrate)[生成数据库] image.png 然后产生如下目录: image.png 连接sb.sqlite3的方法如下: 打开Navicat, image.png 复制sb.sqlite3的路径 image.png 把路径复制到如下: image.png 然后能看到已生成的app01_userinfo 的表(所创建的表) image.png
通过include 来实现Django路由分发(通过一级路由和二级路由) $效果图: image.png image.png 一级路由: image.png 修改urls.py: from django.conf.urls import url,include from django.contrib import admin # from app01 import views as V1 # from app02 import views as V2 # from app01 import views urlpatterns = [ url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ] 二级路由: image.png 修改app01\urls.py from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^login/', views.login), ] 二级路由: image.png 修改app02\urls.py from django.conf.urls import url,include from django.contrib import admin from app02 import views urlpatterns = [ url(r'^login/', views.login), ] image.png 修改views.py from django.shortcuts import render,HttpResponse # Create your views here. def login(request): return HttpResponse('APP02,login') index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url 'indexx' nid=1 uid=3 %}" method="post"> <p><input type="text" name="user" placeholder="用户名"></p> <p><input type="text" name="email" placeholder="邮箱"></p> <input type="submit" value="提交"> </form> <ul> {% for k,row in user_dict.items %} <!--target="_blank"表示在新页面打开--> <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body> </html> login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--# 如果要上传文件表单要加上enctype="multipart/form-data"--> <form action="/login/" method="post" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名"> </p> <p> <input type="password" name="pwd" placeholder="密码"> </p> <p> 男: <input type="radio" name="gender" value="1"> 女: <input type="radio" name="gender" value="2"> 卡米: <input type="radio" name="gender" value="3"> </p> <p> 男: <input type="checkbox" name="favor" value="11"> 女: <input type="checkbox" name="favor" value="22"> 卡米: <input type="checkbox" name="favor" value="33"> </p> <p> <select name="city" id=""> <option value="sh">上海</option> <option value="bj">北京</option> <option value="tj">天津</option> </select> </p> <p> <!--上传文件的标签--> <input type="file" name="fff"> </p> <input type="submit" value="提交"> </form> </body> </html>
$ 效果图: image.png image.png 实现原理: urls.py: from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^index/', views.index), url(r'^asdfasdfasdf/(\d+)/(\d+)/', views.index, name='indexx'), url(r'^login/', views.login), # url(r'^home/', views.home), # views.Home.as_view()是固定用法 url(r'^home/', views.Home.as_view()), # url(r'^detail/', views.detail), url(r'^detail-(\d+).html', views.detail), # url(r'^detail-(\d+)-(\d+).html', views.detail), # url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail), ] image.png image.png 修改views.py: from django.shortcuts import render,HttpResponse,redirect # Create your views here. # USER_DICT = { # 'k1': 'root1', # 'k2': 'root2', # 'k3': 'root3', # 'k4': 'root4', # } USER_DICT = { '1': {'name': 'root1', 'email': 'root@live.com'}, '2': {'name': 'root2', 'email': 'root@live.com'}, '3': {'name': 'root3', 'email': 'root@live.com'}, '4': {'name': 'root4', 'email': 'root@live.com'}, '5': {'name': 'root5', 'email': 'root@live.com'}, } def index(request,nid,unid): # indexx print(request.path_info) # /asdfasdfasdf/13/ # reverse 能反转 from django.urls import reverse v = reverse('indexx', args=(90,88,)) print(v) return render(request, 'index.html', {'user_dict': USER_DICT}) # def detail(request): # nid = request.GET.get('nid') # detail_info = USER_DICT[nid] # return render(request, 'detail.html', {'detail_info': detail_info}) def detail(request, nid): # print(nid, uid) # return HttpResponse(nid) detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info}) ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") # def home(request): # return HttpResponse('Home') from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png 修改index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{{ request.path_info }}" method="post"> <p><input type="text" name="user" placeholder="用户名"></p> <p><input type="text" name="email" placeholder="邮箱"></p> <input type="submit" value="提交"> </form> <ul> {% for k,row in user_dict.items %} <!--target="_blank"表示在新页面打开--> <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body> </html> image.png @进一步: index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url 'indexx' nid=1 uid=3 %}" method="post"> <p><input type="text" name="user" placeholder="用户名"></p> <p><input type="text" name="email" placeholder="邮箱"></p> <input type="submit" value="提交"> </form> <ul> {% for k,row in user_dict.items %} <!--target="_blank"表示在新页面打开--> <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body> </html> image.png views.py: from django.shortcuts import render,HttpResponse,redirect # Create your views here. # USER_DICT = { # 'k1': 'root1', # 'k2': 'root2', # 'k3': 'root3', # 'k4': 'root4', # } USER_DICT = { '1': {'name': 'root1', 'email': 'root@live.com'}, '2': {'name': 'root2', 'email': 'root@live.com'}, '3': {'name': 'root3', 'email': 'root@live.com'}, '4': {'name': 'root4', 'email': 'root@live.com'}, '5': {'name': 'root5', 'email': 'root@live.com'}, } def index(request,nid,uid): # indexx print(request.path_info) # /asdfasdfasdf/13/ # reverse 能反转 from django.urls import reverse # v = reverse('indexx', args=(90,88,)) v = reverse('indexx', kwargs={'nid':'1','uid':'99'}) print(v) return render(request, 'index.html', {'user_dict': USER_DICT}) # def detail(request): # nid = request.GET.get('nid') # detail_info = USER_DICT[nid] # return render(request, 'detail.html', {'detail_info': detail_info}) def detail(request, nid): # print(nid, uid) # return HttpResponse(nid) detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info}) ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") # def home(request): # return HttpResponse('Home') from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^index/', views.index), url(r'^asdfasdfasdf/(?P<nid>\d+)/(?P<uid>\d+)/', views.index, name='indexx'), url(r'^login/', views.login), # url(r'^home/', views.home), # views.Home.as_view()是固定用法 url(r'^home/', views.Home.as_view()), # url(r'^detail/', views.detail), url(r'^detail-(\d+).html', views.detail), # url(r'^detail-(\d+)-(\d+).html', views.detail), # url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail), ] image.png ! 效果图: image.png image.png
image.png urls.py: """s14day19_2 URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), # url(r'^home/', views.home), # views.Home.as_view()是固定用法 url(r'^home/', views.Home.as_view()), url(r'^detail/', views.detail), ] image.png index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--{{ user_dict.k1 }}--> <!--<ul>--> <!--{% for k in user_dict.keys %}--> <!--<li>{{ k }}</li>--> <!--{% endfor %}--> <!--</ul>--> <!--<ul>--> <!--{% for val in user_dict.values %}--> <!--<li>{{ val }}</li>--> <!--{% endfor %}--> <!--</ul>--> <ul> {% for k,row in user_dict.items %} <!--target="_blank"表示在新页面打开--> <li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }}</a></li> {% endfor %} </ul> </body> </html> image.png image.png detail.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>详细信息</h1> <h6>用户名: {{ detail_info.name }}</h6> <h6>邮箱: {{ detail_info.email }}</h6> </body> </html> 运行django(http://127.0.0.1:8000/index/) 效果图: image.png image.png image.png @ 进一步动态路由 修改urls.py(Django基于正则表达式的URL): from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), # url(r'^home/', views.home), # views.Home.as_view()是固定用法 url(r'^home/', views.Home.as_view()), # url(r'^detail/', views.detail), url(r'^detail-(\d+).html', views.detail), ] image.png 修改views.py: from django.shortcuts import render,HttpResponse,redirect # Create your views here. # USER_DICT = { # 'k1': 'root1', # 'k2': 'root2', # 'k3': 'root3', # 'k4': 'root4', # } USER_DICT = { '1': {'name': 'root1', 'email': 'root@live.com'}, '2': {'name': 'root2', 'email': 'root@live.com'}, '3': {'name': 'root3', 'email': 'root@live.com'}, '4': {'name': 'root4', 'email': 'root@live.com'}, '5': {'name': 'root5', 'email': 'root@live.com'}, } def index(request): return render(request, 'index.html', {'user_dict': USER_DICT}) # def detail(request): # nid = request.GET.get('nid') # detail_info = USER_DICT[nid] # return render(request, 'detail.html', {'detail_info': detail_info}) def detail(request, nid): # return HttpResponse(nid) detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info}) ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") # def home(request): # return HttpResponse('Home') from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png 修改index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--{{ user_dict.k1 }}--> <!--<ul>--> <!--{% for k in user_dict.keys %}--> <!--<li>{{ k }}</li>--> <!--{% endfor %}--> <!--</ul>--> <!--<ul>--> <!--{% for val in user_dict.values %}--> <!--<li>{{ val }}</li>--> <!--{% endfor %}--> <!--</ul>--> <!--<ul>--> <!--{% for k,row in user_dict.items %}--> <!--&lt;!&ndash;target="_blank"表示在新页面打开&ndash;&gt;--> <!--<li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }}</a></li>--> <!--{% endfor %}--> <!--</ul>--> <ul> {% for k,row in user_dict.items %} <!--target="_blank"表示在新页面打开--> <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body> </html> image.png $ 效果图: image.png image.png
image.png 修改views.py from django.shortcuts import render,HttpResponse,redirect # Create your views here. USER_DICT = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', 'k4': 'root4', } def index(request): return render(request, 'index.html', {'user_dict': USER_DICT}) ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") # def home(request): # return HttpResponse('Home') from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ user_dict.k1 }} <ul> {% for k in user_dict.keys %} <li>{{ k }}</li> {% endfor %} </ul> <ul> {% for val in user_dict.values %} <li>{{ val }}</li> {% endfor %} </ul> <ul> {% for k,row in user_dict.items %} <li>{{ k }}-{{ row }}</li> {% endfor %} </ul> </body> </html> 效果图: image.png
4. FBV & CBV function base view url.py index -> 函数名 view.py def 函数(request): ... ===> /index/ -> 函数名 /index/ -> 类 ===> 建议:两者都用 image.png 修改urls.py: """s14day19_2 URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), # url(r'^home/', views.home), # views.Home.as_view()是固定用法 url(r'^home/', views.Home.as_view()), ] image.png image.png 新建home.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/home/" method="POST"> <input type="text" name="user"> <input type="submit"> </form> </body> </html> image.png 修改views.py: from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") # def home(request): # return HttpResponse('Home') from django.views import View class Home(View): # 调用父类中的dispatch(相当于助理,) def dispatch(self, request, *args, **kwargs): print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method, 'POST') return render(request, 'home.html') image.png 效果图: image.png image.png
image.png 修改login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p> <input type="text" name="user" placeholder="用户名"> </p> <p> <input type="password" name="pwd" placeholder="密码"> </p> <p> 男: <input type="radio" name="gender" value="1"> 女: <input type="radio" name="gender" value="2"> 卡米: <input type="radio" name="gender" value="3"> </p> <input type="submit" value="提交"> </form> </body> </html> image.png image.png 修改views.py from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": v = request.POST.get('gender') print(v) return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") image.png image.png image.png 效果图: image.png image.png @进一步 修改views.py from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) v = request.POST.getlist('favor') print(v) return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") 修改login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p> <input type="text" name="user" placeholder="用户名"> </p> <p> <input type="password" name="pwd" placeholder="密码"> </p> <p> 男: <input type="radio" name="gender" value="1"> 女: <input type="radio" name="gender" value="2"> 卡米: <input type="radio" name="gender" value="3"> </p> <p> 男: <input type="checkbox" name="favor" value="11"> 女: <input type="checkbox" name="favor" value="22"> 卡米: <input type="checkbox" name="favor" value="33"> </p> <input type="submit" value="提交"> </form> </body> </html> image.png 效果图: image.png image.png @ 进一步把上传文件拿到 image.png 修改login.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--# 如果要上传文件表单要加上enctype="multipart/form-data"--> <form action="/login/" method="post" enctype="multipart/form-data"> <p> <input type="text" name="user" placeholder="用户名"> </p> <p> <input type="password" name="pwd" placeholder="密码"> </p> <p> 男: <input type="radio" name="gender" value="1"> 女: <input type="radio" name="gender" value="2"> 卡米: <input type="radio" name="gender" value="3"> </p> <p> 男: <input type="checkbox" name="favor" value="11"> 女: <input type="checkbox" name="favor" value="22"> 卡米: <input type="checkbox" name="favor" value="33"> </p> <p> <select name="city" id=""> <option value="sh">上海</option> <option value="bj">北京</option> <option value="tj">天津</option> </select> </p> <p> <!--上传文件的标签--> <input type="file" name="fff"> </p> <input type="submit" value="提交"> </form> </body> </html> image.png $ image.png 修改views.py from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把上传文件读取一点一点拿到 f = open(obj.name, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") image.png image.png -@效果图: image.png 1.PNG image.png image.png @ 目的要求:想把所上传的文件放到统一文件里面 image.png 新建upload 文件夹 修改views.py: from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") ''' def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": # radio # v = request.POST.get('gender') # print(v) # v = request.POST.getlist('favor') # print(v) v = request.POST.get('fff') print(v) # 所有上传文件都上传到request.FILES obj = request.FILES.get('fff') print(obj, type(obj), obj.name) # 把所上传的文件放到所建立的文件夹 import os file_path = os.path.join('upload',obj.name) # 把上传文件读取一点一点拿到 f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close() return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") image.png $效果图: image.png image.png
Django基础(http://www.cnblogs.com/wupeiqi/articles/5237704.html) Django进阶(http://www.cnblogs.com/wupeiqi/articles/5246483.html) 1. 路由系统, URL 1. url(r'^index/', views.index), url(r'^home/', views.Home.as_view()), 2. url(r'^detail-(\d+).html', views.detail), 3. url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail), ps: def detail(request, *args, **kwargs): pass 实战: a. url(r'^detail-(\d+)-(\d+).html', views.detail), def func(request,nid, uid): pass def detail(request, *args): pass def detail(request, *args): pass b. url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) def func(request, nid,uid): pass def func(request, **kwargs): kwargs = {'nid': 1, 'uid': 3} def func(request, *args, **kwargs): args = (2, 9) 4. name(作用:根据此名称生成自己想要的URL) 对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL url(r'^asdfasdfasdf/', views.index, name='i1'), url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'), url(r'^buy/(?P<pid>\d+)/(?P<pid>\d+)/', views.index, name='i3'), def func(request, *args,**kwargs): from django.urls import reverse url1 = reverse('i1') # asdfasdfasdf/ url1 = reverse('i2', args=(1,2)) # yug/1/2 url1 = reverse('i2', kwargs={'pid':1,'nid':9}) # yug/1/9 xxx.html {% url "i1" %} # asdfasdfasdf/ {% url "i2" 1 2 %} # yug/1/2 {% url "i3" pid=1 nid=9 %} # yug/1/9 模板语言: {% url "indexx" %} {% url "indexx" 3 %} # 注意: # 当前的URL request.path_info 2.视图 request.GET request.POST request.FILES # checkbox等多选的内容 request.POST.getlist() # 上传文件,form标签要做特殊设置 obj.request..FILES.get('fff') obj.name f = open(obj.name, mode='wb') for item in obj.chunks(): f.write(item) f.close() 4. FBV & CBV function base view url.py index -> 函数名 view.py def 函数(request): ... ===> /index/ -> 函数名 /index/ -> 类 ===> 建议:两者都用 3.模板 4.ORM操作 select * from tb where id >1 # 对应关系 models.tb.objects.filters(id__gt=1) models.tb.objects.filters(id=1) models.tb.objects.filters(id__lt=1) 1.Django请求生命周期 1.Django请求生命周期 -> URL对应关系 (匹配) -> 视图函数 -> 返回用户字符串 -> URL对应关系 (匹配) -> 视图函数 -> 打开一个HTML文件,读取内容 2. 创建django project django-admin startproject mysite ''' mysite mysite - 配置文件 - url.py - settings.py cd mysite python manage.py startapp cmdb mysite mysite - 配置文件 - url.py - settings.py cmdb - views.py - admin.py - models.py # 创建数据库表 3,配置 模板路径 静态文件路径 # CSRF 4.编写程序 a.url.py /index/ -> func b.views.py def func(request): # 包含所有的请求数据 --- return HttpResponse('字符串') return render(request,'index.html',{''}) return redirect('URL') c.模板语言 return render (request, 'index.html', {'li': [11,22,33]}) {% for item in %} <h1>{{ item }}</h1> {% endfor %} **********索引 ************ <h2> {{ item.0 }} </h2> GET: 获取数据 POST: 提交数据
用pychram创建Django程序 file->New Project image.png image.png image.png python manage.py startapp app01 image.png 配置settings.py 文件 image.png image.png 最后一行添加以下: STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) image.png 修改urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), ] image.png 修改views.py from django.shortcuts import render,HttpResponse # Create your views here. def index(request): return HttpResponse('Index') image.png image.png 基本程序效果图: image.png @进一步 image.png 修改urls.py from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), ] image.png 修改views.py from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return HttpResponse('Index') def login(request): # 判断用户获取数据方式是GET,就返回什么数据 if request.method == "GET": return render(request, 'login.html') # 判断用户获取数据方式是POST,就判断用户提交的数据是否正确 elif request.method == "POST": u = request.POST.get('user') p = request.POST.get('pwd') if u == 'alex' and p == '123': return redirect('/index/') else: return render(request, 'login.html') else: # PUT,DELETE,HEAD,OPTION... return redirect("/index/") image.png 修改login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p> <input type="text" name="user" placeholder="用户名"> </p> <p> <input type="password" name="pwd" placeholder="密码"> </p> <input type="submit" value="提交"> </form> </body> </html> image.png 效果图: image.png image.png
知识点整理: 内容整理 1. 创建Django工程 django-admin startproject 工程名 2. 创建APP cd 工程名 python manage.py startapp cmdb 3、静态文件 project.settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) 4、模板路径 DIRS ==> [os.path.join(BASE_DIR,'templates'),] 5、settings中 middlerware # 注释 csrf 6、定义路由规则 url.py "login" --> 函数名 7、定义视图函数 app下views.py def func(request): # request.method GET / POST # http://127.0.0.1:8009/home?nid=123&name=alex # request.GET.get('',None) # 获取请求发来的而数据 # request.POST.get('',None) # return HttpResponse("字符串") # return render(request, "HTML模板的路径") # return redirect('/只能填URL') 8、模板渲染 特殊的模板语言 -- {{ 变量名 }} def func(request): return render(request, "index.html", {'current_user': "alex"}) index.html <html> .. <body> <div>{{current_user}}</div> </body> </html> ====> 最后生成的字符串 <html> .. <body> <div>alex</div> </body> </html> -- For循环 def func(request): return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']}) index.html <html> .. <body> <div>{{current_user}}</div> <ul> {% for row in user_list %} {% if row == "alex" %} <li>{{ row }}</li> {% endif %} {% endfor %} </ul> </body> </html> #####索引################# def func(request): return render(request, "index.html", { 'current_user': "alex", 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> </body> </html> ###### 条件 def func(request): return render(request, "index.html", { 'current_user': "alex", "age": 18, 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> {% if age %} <a>有年龄</a> {% if age > 16 %} <a>老男人</a> {% else %} <a>小鲜肉</a> {% endif %} {% else %} <a>无年龄</a> {% endif %} </body> </html> XXOO管理: MySQL SQLAlchemy 主机管理(8列): IP 端口 业务线 ... 用户表: 用户名 密码 功能: 1、 登录 2、主机管理页面 - 查看所有的主机信息(4列) - 增加主机信息(8列) ** 模态对话框 3、查看详细 url: "detail" -> detail def detail(reqeust): nid = request.GET.get("nid") v = select * from tb where id = nid ... 4、删除 del_host -> delete_host def delete_host(request): nid = request.POST.get('nid') delete from tb where id = nid return redirect('/home') 模态对话框 修改 home.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <form action="/home" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="text" name="email" placeholder="邮箱"> <input type="text" name="gender" placeholder="性别"> <input type="submit" value="添加"> </form> </div> <div> <table> <!--django支持 for 循环,与Python不一样,这是模板语言for循环 有开头就有结尾 endfor--> {% for row in user_list %} <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> <td> <a href="/detail?nid={{ row.id }}">查看详细</a> <a class="del" href="#" row-id="{{ row.id }}">删除</a> </td> </tr> {% endfor %} </table> </div> <!--绑定事件--> $('.del').click(function(){ var row_id = $(this).attr('row-id'); $('#nid').val(row_id); }) <div> <form action="/del_host" method="post"> <input style="display: none" id="nid" type="text" name="nid"> <p> <input type="submit"> <input type="botton"> </p> </form> </div> </body> </html> image.png image.png 效果图: image.png
目的我想登陆成功后显示我的后台管理(实现过程): 新建home.html 在templates目录下代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <table> <tr> <td>js</td> <td>女</td> <td>alex123@163.com</td> </tr> <tr> <td>bs</td> <td>女</td> <td>alex456@163.com</td> </tr> <tr> <td>cs</td> <td>男</td> <td>alex123@qq.com</td> </tr> </table> </div> </body> </html> image.png 然后在urls.py 添加以下代码: from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'h.html/', views.home), url(r'^login', views.login), url(r'^home', views.home), ] image.png image.png 修改 views.py 代码如下: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 重定向 from django.shortcuts import redirect def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 error_msg = "" if request.method == "POST": # 获取用户通过POST提交过来的数据(用户不存在返回None) user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == "123": # 去跳转到(重定向) return redirect('/home') else: # 用户密码不正确 error_msg = "用户名或密码错误" # user = request.POST['user'] # pwd = request.POST['pwd'] # print(user,pwd) return render(request, 'login.html', {'error_msg': error_msg}) def home(request): return render(request, 'home.html') # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') # def home(request): # return HttpResponse('<h1>CMDB</h1>') image.png image.png 效果图: image.png django使用for循环 修改views.py: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 重定向 from django.shortcuts import redirect def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 error_msg = "" if request.method == "POST": # 获取用户通过POST提交过来的数据(用户不存在返回None) user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == "123": # 去跳转到(重定向) return redirect('/home') else: # 用户密码不正确 error_msg = "用户名或密码错误" # user = request.POST['user'] # pwd = request.POST['pwd'] # print(user,pwd) return render(request, 'login.html', {'error_msg': error_msg}) USER_LIST = [ {'username':'alex','email':'asdfasdf',"gender":'男'}, ] for index in range(20): temp = {'username':'alex'+str(index),'email':'asdfasdf',"gender":'男'} USER_LIST.append(temp) def home(request): return render(request, 'home.html',{'user_list': USER_LIST}) # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') # def home(request): # return HttpResponse('<h1>CMDB</h1>') image.png 修改urls.py : from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'h.html/', views.home), url(r'^login', views.login), url(r'^home', views.home), ] image.png 修改 home.html : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <table> <!--django支持 for 循环,与Python不一样,这是模板语言for循环 有开头就有结尾 endfor--> {% for row in user_list %} <tr> <td>js</td> <td>女</td> <td>alex123@163.com</td> </tr> {% endfor %} </table> </div> </body> </html> image.png 效果图: image.png 另一种修改: views.py和urls.py 代码同上不修改 home.html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <table> <!--django支持 for 循环,与Python不一样,这是模板语言for循环 有开头就有结尾 endfor--> {% for row in user_list %} <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %} </table> </div> </body> </html> image.png 效果图: image.png 获取用户输入数据展示: image.png 修改 views.py: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 重定向 from django.shortcuts import redirect def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 error_msg = "" if request.method == "POST": # 获取用户通过POST提交过来的数据(用户不存在返回None) user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == "123": # 去跳转到(重定向) return redirect('/home') else: # 用户密码不正确 error_msg = "用户名或密码错误" # user = request.POST['user'] # pwd = request.POST['pwd'] # print(user,pwd) return render(request, 'login.html', {'error_msg': error_msg}) USER_LIST = [ {'username':'alex','email':'asdfasdf',"gender":'男'}, {'username':'alex','email':'asdfasdf',"gender":'男'}, {'username':'alex','email':'asdfasdf',"gender":'男'}, ] # for index in range(20): # temp = {'username':'alex'+str(index),'email':'asdfasdf',"gender":'男'} # USER_LIST.append(temp) def home(request): if request.method == "POST": # 获取用户提交的数据 POST 请求中 u = request.POST.get('username') e = request.POST.get('email') g = request.POST.get('gender') temp = {'username': u, 'email': e, "gender": g} USER_LIST.append(temp) return render(request, 'home.html',{'user_list': USER_LIST}) # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') # def home(request): # return HttpResponse('<h1>CMDB</h1>') image.png 修改 home.html placeholder能在输入显示自己所写的内容(如效果图) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;background-color: #dddddd"></div> <div> <form action="/home" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="text" name="email" placeholder="邮箱"> <input type="text" name="gender" placeholder="性别"> <input type="submit" value="添加"> </form> </div> <div> <table> <!--django支持 for 循环,与Python不一样,这是模板语言for循环 有开头就有结尾 endfor--> {% for row in user_list %} <tr> <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %} </table> </div> </body> </html> image.png image.png 效果图: image.png image.png
用户名和密码验证: 首先在settings.py 把csrf注释如图: image.png image.png 修改login.html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/commons.css" /> <style> label{ width: 80px; text-align: right; display: inline-block; } </style> </head> <body> <form action="/login" method="post"> <p> <label for="username">用户名:</label> <input id="username" name="user" type="text" /> </p> <p> <label for="password">密码:</label> <input id="password" name="pwd" type="password" /> <input type="submit" value="提交" /> <span style="color: red;">{{ error_msg }}</span> </p> </form> <script src="/static/jquery.min.js"></script> </body> </html> 注意form不要写错 image.png 修改 image.png 修改views.py 代码如下: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 print(request.method) return render(request, 'login.html') # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') def home(request): return HttpResponse('<h1>CMDB</h1>') 运行django访问(http://127.0.0.1:8000/login) 效果图如下(GET方式访问服务器): image.png 能得到用户是用GET方式访问服务器 image.png 效果图如下(POST方式访问服务器)点击提交: image.png image.png 获取用户表单输入的数据: image.png 修改views.py 代码如下: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 if request.method == "POST": # 获取用户通过POST提交过来的数据 user = request.POST['user'] pwd = request.POST['pwd'] print(user,pwd) return render(request, 'login.html') # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') def home(request): return HttpResponse('<h1>CMDB</h1>') 运行(效果图) image.png image.png 上述再修改views.py 进行改进: views.py : from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 重定向 from django.shortcuts import redirect def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 if request.method == "POST": # 获取用户通过POST提交过来的数据(用户不存在返回None) user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == "123": # 去跳转到(重定向) return redirect('http://www.baidu.com') # user = request.POST['user'] # pwd = request.POST['pwd'] # print(user,pwd) return render(request, 'login.html') # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') def home(request): return HttpResponse('<h1>CMDB</h1>') image.png 输入(u: root, m: 123) image.png 效果图: image.png 扩充 views.py 添加以下({'error_msg': '123'}): image.png 注意这里: image.png 效果图(不输入密码): image.png 上述再修改: image.png 修改views.py 代码如下: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # 重定向 from django.shortcuts import redirect def login(request): # 包含用户提交的所有信息 # 获取用户提交方法 # print(request.method) # 判断用户名和密码 error_msg = "" if request.method == "POST": # 获取用户通过POST提交过来的数据(用户不存在返回None) user = request.POST.get('user',None) pwd = request.POST.get('pwd',None) if user == 'root' and pwd == "123": # 去跳转到(重定向) return redirect('http://www.baidu.com') else: # 用户密码不正确 error_msg = "用户名或密码错误" # user = request.POST['user'] # pwd = request.POST['pwd'] # print(user,pwd) return render(request, 'login.html', {'error_msg': error_msg}) # def login(request): # # f = open('templates/login.html', 'r', encoding='utf-8') # # date = f.read() # # f.close() # # return HttpResponse(date) # return render(request,'login.html') def home(request): return HttpResponse('<h1>CMDB</h1>') image.png image.png 效果图: image.png
让很多app都共享的静态文件, 创建一个static目录专门放静态文件: image.png 把jquery.min.js复制到static目录下再创建 commons.css 文件(目录如下): image.png image.png commons.css代码如下: body{ background: gray; } 然后想把它引用到login.html方法: image.png 修改settings.py 文件在最后一行修改添加以下代码: STATIC_URL = '/static/' # os.path.join(BASE_DIR, 'static'), 的逗号很重要,不加会报错 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) image.png 修改login.html: image.png image.png login.html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/commons.css"> <style> label{ width:80px; text-align: right; display:inline-block; } </style> </head> <body> <!--/* action="/login/" 指向urls.py 的login,以post方式提交表单 */--> <from action="/login" method="post"> <p> <label for="username">用户名: </label> <input id="username" type="text" /> </p> <p> <label for="password">密码: </label> <input id="password" type="text" /> <input type="submit" value="提交" /> </p> </from> <script src="/static/jquery.min.js"></script> </body> </html> 运行django文件效果图: image.png 知识点: 1、配置模板的路径 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] 2、配置静态目录 static STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) <link rel="stylesheet" href="/static/commons.css" />
Django实现用户登录 修改urls.py 文件: from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'h.html/', views.home), url(r'login', views.login), ] 创建以下目录: 新建login.html (用户登录表单 ) 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> label{ width:80px: text-align: right: } </style> </head> <body> <!--/* action="/login/" 指向urls.py 的login,以post方式提交表单 */--> <from action="/login" method="post"> <p> <label for="username">用户名: </label> <input id="username" type="text" /> </p> <p> <label for="password">密码: </label> <input id="password" type="text" /> <input type="submit" value="提交" /> </p> </from> </body> </html> 修改views.py 文件: image.png views.py 代码如下: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse def login(request): f = open('templates/login.html', 'r', encoding='utf-8') date = f.read() f.close() return HttpResponse(date) def home(request): return HttpResponse('<h1>CMDB</h1>') 运行: 效果图 效果图如下(http://127.0.0.1:8000/login): () 再修改以下login.html代码: <style> label{ width:80px; text-align: right; display:inline-block; } </style> image.png 再运行效果图: image.png 代码再修改-- 修改views.py文件代码(比上述代码减少): from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render # new def login(request): # f = open('templates/login.html', 'r', encoding='utf-8') # date = f.read() # f.close() # return HttpResponse(date) return render(request,'login.html') # new def home(request): return HttpResponse('<h1>CMDB</h1>') 再刷新浏览器同样获得同样效果: image.png
pycharm在注释html代码的时候变成了{#.......#}的格式 比如这样:{# <div class="box-tools pull-right">#} image.png File->Settings->Languages & Frameworks->Puppet->Python Template Languages->Templates language 选择为None 如下图: image.png 亲测有效 image.png
app: migrations 数据修改表结构 admin Django为我们提供的后台管理 apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测试 views 业务代码 接下来在 image.png 修改models.py 文件: from django.db import models # Create your models here. class UserType(models.Model): name = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) pwd = models.CharField(max_length=32) email = models.CharField(max_length=32) user_type = models.ForeignKey(UserType) 然后在 image.png 修改settings.py 文件: # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cmdb', ] image.png 然后在Terminal 运行以下命令: (python manage.py makemigrations) (python manage.py migrate) (python3) C:\Users\Administrator\PycharmProjects\s14django>python manage.py makemigrations Migrations for 'cmdb': cmdb\migrations\0001_initial.py: - Create model UserInfo - Create model UserType - Add field user_type to userinfo (python3) C:\Users\Administrator\PycharmProjects\s14django>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, cmdb, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_nam e... OK Applying auth.0002_alter_permission_name_max_lengt h... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying cmdb.0001_initial... OK Applying sessions.0001_initial... OK (python3) C:\Users\Administrator\PycharmProjects\s14django> 如下图: 接下来在: image.png 在admin.py 修改代码如下(创建后台管理): from django.contrib import admin from cmdb import models # Register your models here. admin.site.register(models.UserInfo) admin.site.register(models.UserType) 在在Terminal 运行以下命令: image.png 创建超级管理员(python manage.py createsuperuser) (python3) C:\Users\Administrator\PycharmProjects\s14 django>python manage.py createsuperuser Username (leave blank to use 'administrator'): alex Email address: 123@qq.com Password: asdfzxcv Password (again):asdfzxcv 然后运行 image.png 打开浏览器(http://127.0.0.1:8000/admin)得到下图: image.png 输入u(alex)m(asdfzxcv) 登录如下图: image.png image.png
# 创建app python manage.py startapp cmdb python manage.py startapp openstack python manage.py startapp xxoo.... app: migrations 数据修改表结构 admin Django为我们提供的后台管理 apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测试 views 业务代码 在pychram编辑django方法: image.png 点击 Edit Confirurations 然后得到如下图: image.png Django创建App(用pychram创建Django的app)方法如下: image.png Microsoft Windows [版本 10.0.16299.492] (c) 2017 Microsoft Corporation。保留所有权利。 (python3) C:\Users\Administrator\PycharmProjects\s14django>python manage.py startapp cmdb (python3) C:\Users\Administrator\PycharmProjects\s14django> 然后看到如图(创建了一个cmdb的app): image.png 再创建一个openstack的app: (python3) C:\Users\Administrator\PycharmProjects\s14django>python manage.py startapp openstack 更改s14django目录下的urls.py文件: from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'h.html/', views.home), ] 然后更改cmdb目录下的views文件: from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse def home(request): return HttpResponse('<h1>Hello</h1>') 运行django: image.png image.png 在浏览器器输入(http://127.0.0.1:8000/h.html/)能看到以下效果: image.png image.png image.png
4、Django(django版本1.10.4) 下载开发包第三方镜像(加速下载) pip install -i htps://pypi.douban.com/simple/ django ==1.10.4 卸载方法 pip uninstall django (python3) C:\Users\Administrator>pip install django==1.10.4 Requirement already satisfied: django==1.10.4 in e:\evns\python3\lib\site-packages (1.10.4) gerapy 0.8.5 has requirement django>=1.11, but you'll have django 1.10.4 which is incompatible. (python3) C:\Users\Administrator>pip show django Name: Django Version: 1.10.4 Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design. Home-page: http://www.djangoproject.com/ Author: Django Software Foundation Author-email: foundation@djangoproject.com License: BSD Location: e:\evns\python3\lib\site-packages Requires: Required-by: pip3 install django == 1.10.4 C:\Python35\Scripts # 创建Django工程 django-admin startproject 【工程名称】 mysite - mysite # 对整个程序进行配置 - init - settings # 配置文件 - url # URL对应关系 - wsgi # 遵循WSIG规范,uwsgi + nginx - manage.py # 管理Django程序: - python manage.py - python manage.py startapp xx - python manage.py makemigrations - python manage.py migrate # 运行Django功能 python manage.py runserver 127.0.0.1:8001 chouti - chouti - 配置 - 主站 app - 后台管理 app # 创建app python manage.py startapp cmdb python manage.py startapp openstack python manage.py startapp xxoo.... app: migrations 数据修改表结构 admin Django为我们提供的后台管理 apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测试 views 业务代码 1、配置模板的路径 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] 2、配置静态目录 static STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) <link rel="stylesheet" href="/static/commons.css" /> 内容整理 1. 创建Django工程 django-admin startproject 工程名 2. 创建APP cd 工程名 python manage.py startapp cmdb 3、静态文件 project.settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) 4、模板路径 DIRS ==> [os.path.join(BASE_DIR,'templates'),] 5、settings中 middlerware # 注释 csrf 6、定义路由规则 url.py "login" --> 函数名 7、定义视图函数 app下views.py def func(request): # request.method GET / POST # http://127.0.0.1:8009/home?nid=123&name=alex # request.GET.get('',None) # 获取请求发来的而数据 # request.POST.get('',None) # return HttpResponse("字符串") # return render(request, "HTML模板的路径") # return redirect('/只能填URL') 8、模板渲染 特殊的模板语言 -- {{ 变量名 }} def func(request): return render(request, "index.html", {'current_user': "alex"}) index.html <html> .. <body> <div>{{current_user}}</div> </body> </html> ====> 最后生成的字符串 <html> .. <body> <div>alex</div> </body> </html> -- For循环 def func(request): return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']}) index.html <html> .. <body> <div>{{current_user}}</div> <ul> {% for row in user_list %} {% if row == "alex" %} <li>{{ row }}</li> {% endif %} {% endfor %} </ul> </body> </html> #####索引################# def func(request): return render(request, "index.html", { 'current_user': "alex", 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> </body> </html> ###### 条件 def func(request): return render(request, "index.html", { 'current_user': "alex", "age": 18, 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> {% if age %} <a>有年龄</a> {% if age > 16 %} <a>老男人</a> {% else %} <a>小鲜肉</a> {% endif %} {% else %} <a>无年龄</a> {% endif %} </body> </html> 然后用pychram创建django程序方法: 点击 file > New Project 然后新建如下图: image.png 选择Python的解析器(3.6) , 点击Create, image.png 得到以下目录: image.png image.png image.png 然后点击(http://127.0.0.1:8000/) 就能得到以下效果: image.png
下载开发包第三方镜像(加速下载) pip install -i htps://pypi.douban.com/simple/ django ==1.10.4 卸载方法 pip uninstall django 1. 在dos命令行中输入 pip 如下命令进行安装: 安装最新的版本的 Django 命令如下: pip install django 安装 指定版本的 Django 命令如下: pip install django==1.10.3 2. 在这里推荐 使用 指定版本的 django 来安装 安装成功以后的截图: 3. 使用 show 来查看当前安装的 django库 pip show django 3. 使用pip命令来 卸载 Django pip uninstall django
Python的虚拟环境的安装与配置(virtualenv) win+r 打开cmd pip install virtualenv 如下(): Microsoft Windows [版本 10.0.16299.492] (c) 2017 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>pip install virtualenv Requirement already satisfied: virtualenv in c:\anaconda3\lib\site-packages (16.0.0) notebook 5.4.0 requires ipykernel, which is not installed. jupyter 1.0.0 requires ipykernel, which is not installed. jupyter-console 5.2.0 requires ipykernel, which is not installed. ipywidgets 7.1.1 requires ipykernel>=4.5.1, which is not installed. C:\Users\Administrator> 安装虚拟环境管理包(https://blog.csdn.net/leafage_m/article/details/72854559): 详细方法(https://blog.csdn.net/shaququ/article/details/54292043) pip install virtualenvwrapper win 如下: C:\Users\Administrator>pip install virtualenvwrapper win Requirement already satisfied: virtualenvwrapper in c:\anaconda3\lib\site-packages (4.8.2) Collecting win Could not find a version that satisfies the requirement win (from versions: ) No matching distribution found for win C:\Users\Administrator> 修改虚拟环境默认的创建的目录如下图: image.png image.png 新建如下图: image.png 然后确定保存, 然后如下: C:\Users\Administrator>workon Pass a name to activate one of the following virtualenvs: ============================================================================== blogproject_env mxonline python2 python3 C:\Users\Administrator> 创建虚拟环境 创建一个py3scrapy虚拟环境 C:\Users\Administrator>mkvirtualenv py3scrapy Using base prefix 'c:\\anaconda3' New python executable in E:\Evns\py3scrapy\Scripts\python.exe Installing setuptools, pip, wheel...done. (py3scrapy) C:\Users\Administrator> 然后在E:\Evns目录能看到所创建的虚拟环境: image.png
4、Django 安装方法: pip3 install django 4、Django pip3 install django C:\Python35\Scripts # 创建Django工程 django-admin startproject 【工程名称】 mysite - mysite # 对整个程序进行配置 - init - settings # 配置文件 - url # URL对应关系 - wsgi # 遵循WSIG规范,uwsgi + nginx - manage.py # 管理Django程序: - python manage.py - python manage.py startapp xx - python manage.py makemigrations - python manage.py migrate # 运行Django功能 python manage.py runserver 127.0.0.1:8001
Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。 详细阅读(http://www.cnblogs.com/wupeiqi/articles/5237672.html) 新建以下目录: image.png s1.py(用Python2解析器): #!/usr/bin/env python # coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main() s2.py(用Python2解析器): # -*- coding:utf-8 -*- from wsgiref.simple_server import make_server def RunServer(environ, start_response): # environ 客户的发来的所有数据 # start_response 封装要返回给用户的数据,响应头状态 start_response('200 OK', [('Content-Type', 'text/html')]) # 返回的内容 return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print("Serving HTTP on port 8000...") httpd.serve_forever() 新建s3.py目录如下(Python3环境运行): image.png s3.py代码如下: # -*- coding:utf-8 -*- from wsgiref.simple_server import make_server def RunServer(environ, start_response): # environ 客户的发来的所有数据 # start_response 封装要返回给用户的数据,响应头状态 start_response('200 OK', [('Content-Type', 'text/html')]) # 返回的内容 return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print("Serving HTTP on port 8000...") httpd.serve_forever() 运行s3.py文件如图: image.png 在浏览器输入(http://127.0.0.1:8000/)显示如下: image.png 3、WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 ############## WEB:MVC、MTV
第06章节-Python3.5-插件轮播(轮播图插件,不重复造轮子) 打开浏览器搜索bxslider或打开(https://bxslider.com/) 或打开bxslider中文翻译网(http://www.jq22.com/jquery-info7010) 或打开(http://www.tonjay.com/401.html)[推荐阅读] 在(https://bxslider.com/install/)下载 image.png 把源码解压(bxslider-4-4.2.12)到以下目录 image.png (bxslider-4-4.2.12)文件主要导入这两个文件如图: image.png image.png 把js, css引入如下: image.png 如何使用在(http://www.jq22.com/jquery-info7010)的这里复制这块的内容如图: image.png image.png 这块也复制 image.png image.png 或下载几张图片更改图片看效果 image.png 更改图片大小 新建s5.html文件(写一个轮播图)完整代码代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="bxslider-4-4.2.12/dist/jquery.bxslider.css"> </head> <body> <!--引入在这里--> <ul class="bxslider"> <li><img src="1.jpg" /></li> <li><img src="2.jpg" /></li> <li><img src="3.jpg" /></li> <li><img src="4.jpg" /></li> </ul> <script src="jquery-1.12.4.js"></script> <script src="bxslider-4-4.2.12/dist/jquery.bxslider.js"></script> <script> $(function(){ $('.bxslider').bxSlider(); }); </script> </body> </html> 打开s5.html效果图: image.png
BootStrap 2、组件 BootStrap - css - js 学习 BootStrap 规则 一、响应式 @media 在以下目录新建s3.html: 目的/我想设置一种效果,当屏幕小于或大于多少时,让某个值生效/ image.png s3.html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--stytle--> <style> .c1{ background-color: red; height:50px; } /*我想设置一种效果,当屏幕小于或大于多少时,让某各值生效*/ @media (min-width: 900px){ .c2{ background-color: grey; } } </style> </head> <body> <!--.c1--> <div class="c1 c2"></div> </body> </html> 然后在浏览器打开s3.html 效果图如下: image.png 屏幕缩小效果: image.png 二、图标、字体 @font-face 想用哪个图标就(https://v3.bootcss.com/components/)的组件复制源码就可以了例如 image.png image.png image.png 源码: <span class="glyphicon-class">glyphicon glyphicon-cloud</span> 三、基本使用(BootStrap使用方法) 把BootStrap源码放到以下目录: image.png 所有到文件目录如下: image.png image.png 把这块源码复制 image.png 新建s4.html文件(s4.html), s4.html代码如下(加入按钮式下拉菜单): <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--link--> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css"> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap-theme.css"> </head> <body> <!--这块是自己想要那个按钮或那个表格就直接复制源码就可以了--> <div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Action <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </div> <!--先导入jQuery--> <script src="jquery-1.12.4.js"></script> <script src="bootstrap-3.3.7-dist/js/bootstrap.js"></script> </body> </html> 效果图: image.png 步骤同上: image.png 修改s4.html代码如下(加入导航条): <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--link--> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css"> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap-theme.css"> </head> <body> <!--加入导航条--> <nav class="navbar navbar-default"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Brand</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> <li role="separator" class="divider"></li> <li><a href="#">One more separated link</a></li> </ul> </li> </ul> <form class="navbar-form navbar-left"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <!--自己想要那个按钮或那个表格就直接复制源码就可以了--> <div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Action <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </div> <!--先导入jQuery--> <script src="jquery-1.12.4.js"></script> <script src="bootstrap-3.3.7-dist/js/bootstrap.js"></script> </body> </html> 效果图: image.png image.png 接着这一步重要(因为导航条的样式4周的框有点圆角,我想把它改成边角) 接下来改属性这样改(修改属性有优先级说法) 修改如下s4.html这块的代码(一般不这样写): </head> <body style="background-color: red"> <!--加入导航条--> <nav class="navbar navbar-default" role="navigation" style="border-radius: 0"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> image.png 打开浏览器效果图: image.png 正确写在css中如下修改s4.html这块代码如下: <head> <meta charset="UTF-8"> <title>Title</title> <!--link--> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css"> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap-theme.css"> <style> .no-radus{ border-radius: 0 } </style> </head> <body style="background-color: red"> <!--加入导航条--> <nav class="navbar navbar-default no-radus" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> 也获得同样效果: image.png 另一种写法s4.html: <head> <meta charset="UTF-8"> <title>Title</title> <style> .no-radus{ border-radius: 0 !important; } </style> <!--link--> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css"> <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap-theme.css"> </head> <body style="background-color: red"> <!--加入导航条--> <nav class="navbar navbar-default no-radus" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header">
EasyUI用法: 把EasyUI下载到本地,然后看文档找到自己想要的样式,然后写到自己的代码里(推荐看源码里的demo文件里的源码)[但存在大量的Ajax操作]{不推荐用} 打开 (http://www.jeasyui.net/)或(http://www.jeasyui.com/download/v155.php)下载jquery-easyui-1.5.5.4文件(点击download下载) 然后目录如下: image.png 新建s2.html 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Basic CRUD Application - jQuery EasyUI CRUD Demo</title> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/icon.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/color.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/demo/demo.css"> <script type="text/javascript" src="jquery-easyui-1.5.5.4/jquery.min.js"></script> <script type="text/javascript" src="jquery-easyui-1.5.5.4/jquery.easyui.min.js"></script> </head> <body> <h2>Basic CRUD Application</h2> <p>Click the buttons on datagrid toolbar to do crud actions.</p> <table id="dg" title="My Users" class="easyui-datagrid" style="width:700px;height:250px" url="get_users.php" toolbar="#toolbar" pagination="true" rownumbers="true" fitColumns="true" singleSelect="true"> <thead> <tr> <th field="firstname" width="50">First Name</th> <th field="lastname" width="50">Last Name</th> <th field="phone" width="50">Phone</th> <th field="email" width="50">Email</th> </tr> </thead> </table> <div id="toolbar"> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newUser()">New User</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-edit" plain="true" onclick="editUser()">Edit User</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-remove" plain="true" onclick="destroyUser()">Remove User</a> </div> <div id="dlg" class="easyui-dialog" style="width:400px" data-options="closed:true,modal:true,border:'thin',buttons:'#dlg-buttons'"> <form id="fm" method="post" novalidate style="margin:0;padding:20px 50px"> <h3>User Information</h3> <div style="margin-bottom:10px"> <input name="firstname" class="easyui-textbox" required="true" label="First Name:" style="width:100%"> </div> <div style="margin-bottom:10px"> <input name="lastname" class="easyui-textbox" required="true" label="Last Name:" style="width:100%"> </div> <div style="margin-bottom:10px"> <input name="phone" class="easyui-textbox" required="true" label="Phone:" style="width:100%"> </div> <div style="margin-bottom:10px"> <input name="email" class="easyui-textbox" required="true" validType="email" label="Email:" style="width:100%"> </div> </form> </div> <div id="dlg-buttons"> <a href="javascript:void(0)" class="easyui-linkbutton c6" iconCls="icon-ok" onclick="saveUser()" style="width:90px">Save</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')" style="width:90px">Cancel</a> </div> <script type="text/javascript"> var url; function newUser(){ $('#dlg').dialog('open').dialog('center').dialog('setTitle','New User'); $('#fm').form('clear'); url = 'save_user.php'; } function editUser(){ var row = $('#dg').datagrid('getSelected'); if (row){ $('#dlg').dialog('open').dialog('center').dialog('setTitle','Edit User'); $('#fm').form('load',row); url = 'update_user.php?id='+row.id; } } function saveUser(){ $('#fm').form('submit',{ url: url, onSubmit: function(){ return $(this).form('validate'); }, success: function(result){ var result = eval('('+result+')'); if (result.errorMsg){ $.messager.show({ title: 'Error', msg: result.errorMsg }); } else { $('#dlg').dialog('close'); // close the dialog $('#dg').datagrid('reload'); // reload the user data } } }); } function destroyUser(){ var row = $('#dg').datagrid('getSelected'); if (row){ $.messager.confirm('Confirm','Are you sure you want to destroy this user?',function(r){ if (r){ $.post('destroy_user.php',{id:row.id},function(result){ if (result.success){ $('#dg').datagrid('reload'); // reload the user data } else { $.messager.show({ // show error message title: 'Error', msg: result.errorMsg }); } },'json'); } }); } } </script> </body> </html> s1.html的代码是从(http://www.jeasyui.com/demo/main/index.php)的网页中的Source Code复制的如图 image.png 把这块的代码如图 image.png : 然后把上述那块的代码修改为如下图: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Basic CRUD Application - jQuery EasyUI CRUD Demo</title> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/icon.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/themes/color.css"> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.5.5.4/demo/demo.css"> <script type="text/javascript" src="jquery-easyui-1.5.5.4/jquery.min.js"></script> <script type="text/javascript" src="jquery-easyui-1.5.5.4/jquery.easyui.min.js"></script> </head> 打开s2.html效果图如下: image.png JQueryUI JQueryUI用法(用法同上): JQueryUI主要用于后台管理 打开(https://jqueryui.com/)然后点击Stable下载: image.png 然后解压源码打开index.html就能看到JQueryUI的所有例子,想用那个例子就右键查看源码直接复制那块源码[推荐指数*] BootStrap(用于全栈也是最好看) BootStrap用法(): 打开(http://www.bootcss.com/)然后点击BootStrap3中文文档 或打开(https://v3.bootcss.com/) 然后能看到各种各样案例也可以在百度搜索BootStrap模板 下载BootStrap image.png
在pychram新建以下目录如图: 捕1获.PNG s1.html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="checkbox" /> <script src="jquery-1.12.4.js"></script> <script> $(':checkbox').click(function () { var v = $(this).prop('checked'); console.log(v); }) </script> </body> </html> js文件就在网上下载 然后打开浏览器打开s1.html效果图如下: image.png image.png
1、JS 正则 (https://www.cnblogs.com/moqing/archive/2016/07/13/5665126.html) (https://www.cnblogs.com/wupeiqi/archive/2016/07/13/5602773.html) test - 判断字符串是否符合规定的正则 正则表达式写法: rep = /\d+/; /\d+/ rep.test("dsfdsjkh1243824fdsfdskjg") true rep.test("dsfdsjkhfdsfdskjg") false 在浏览器打开调试工具F12如下图: p3a1.png p1.png exec - 获取匹配的数据方法: image.png image.png JavaScript全局匹配:(var pattern = /\bJava\w*\b/g;)正则后加g text="JavaScript is more fun than Java or JavaBeans!" "JavaScript is more fun than Java or JavaBeans!" var pattern = /\bJava\w*\b/g; undefined pattern.exec(text) ["JavaScript", index: 0, input: "JavaScript is more fun than Java or JavaBeans!", groups: undefined] pattern.exec(text) ["Java", index: 28, input: "JavaScript is more fun than Java or JavaBeans!", groups: undefined] pattern.exec(text) ["JavaBeans", index: 36, input: "JavaScript is more fun than Java or JavaBeans!", groups: undefined] image.png image.png
接着上一个django创建项目案例1的04继续如下: 定义show.html模板目录如下: [图片上传失败...(image-3b999b-1531897111035)] show.html代码如下: 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {%for hero in list%} <li>{{hero.hname}}</li> {%endfor%} </ul> </body> </html> 在hero info里随意添加内容如图: [图片上传失败...(image-f8d008-1531897111035)] [图片上传失败...(image-39185e-1531897111035)] 使用模板 编辑views.py文件,在方法中调用模板代码如下: #coding:utf-8 from django.shortcuts import render from django.http import * from .models import * # from django.template import RequestContext,loader # Create your views here. def index(request): # temp = loader.get_template('booktest/index.html') # return HttpResponse(temp.render()) bookList=BookInfo.objects.all() context={'list':bookList} return render(request,'booktest/index.html',context) def show(request,id): book=BookInfo.objects.get(pk=id) herolist=book.heroinfo_set.all() context={'list':herolist} return render(request,'booktest/show.html',context) 知识点介绍 去除模板的硬编码 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/” <a href="{{book.id}}"> 看如下情况:将urlconf中详细页改为如下,链接就找不到了 url(r'^book/([0-9]+)/$', views.detail), 此时的请求地址应该为“127.0.0.1/book/1/” 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效 解决:使用命名的url设置超链接 修改test1/urls.py文件,在include中设置namespace url(r'^admin/', include(admin.site.urls, namespace='booktest')), 修改booktest/urls.py文件,设置name url(r'^book/([0-9]+)/$', views.detail, name="detail"), 修改index.html模板中的链接 <a href="{%url 'booktest:detail' book.id%}"> Render简写 Django提供了函数Render()简化视图调用模板、构造上下文 修改booktest目录下的urls.py文件代码目录如下: [图片上传失败...(image-995f40-1531897111035)] 代码如下: #coding:utf-8 from django.conf.urls import url from . import views urlpatterns=[ url(r'^$',views.index), url(r'^(\d+)$',views.show) ] 然后运行python manage.py runserver 效果图如下: [图片上传失败...(image-62414-1531897111035)] [图片上传失败...(image-c715a3-1531897111035)] [图片上传失败...(image-8a6164-1531897111035)] 详细浏览我的博客(https://yq.aliyun.com/users/article?spm=a2c4e.11153940.headeruserinfo.3.24a6291aUNlJjF&do=login)
接着上一个django创建项目案例1的04继续如下: 定义show.html模板目录如下: [图片上传失败...(image-3b999b-1531897111035)] show.html代码如下: 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {%for hero in list%} <li>{{hero.hname}}</li> {%endfor%} </ul> </body> </html> 在hero info里随意添加内容如图: [图片上传失败...(image-f8d008-1531897111035)] [图片上传失败...(image-39185e-1531897111035)] 使用模板 编辑views.py文件,在方法中调用模板代码如下: #coding:utf-8 from django.shortcuts import render from django.http import * from .models import * # from django.template import RequestContext,loader # Create your views here. def index(request): # temp = loader.get_template('booktest/index.html') # return HttpResponse(temp.render()) bookList=BookInfo.objects.all() context={'list':bookList} return render(request,'booktest/index.html',context) def show(request,id): book=BookInfo.objects.get(pk=id) herolist=book.heroinfo_set.all() context={'list':herolist} return render(request,'booktest/show.html',context) 知识点介绍 去除模板的硬编码 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/” <a href="{{book.id}}"> 看如下情况:将urlconf中详细页改为如下,链接就找不到了 url(r'^book/([0-9]+)/$', views.detail), 此时的请求地址应该为“127.0.0.1/book/1/” 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效 解决:使用命名的url设置超链接 修改test1/urls.py文件,在include中设置namespace url(r'^admin/', include(admin.site.urls, namespace='booktest')), 修改booktest/urls.py文件,设置name url(r'^book/([0-9]+)/$', views.detail, name="detail"), 修改index.html模板中的链接 <a href="{%url 'booktest:detail' book.id%}"> Render简写 Django提供了函数Render()简化视图调用模板、构造上下文 修改booktest目录下的urls.py文件代码目录如下: [图片上传失败...(image-995f40-1531897111035)] 代码如下: #coding:utf-8 from django.conf.urls import url from . import views urlpatterns=[ url(r'^$',views.index), url(r'^(\d+)$',views.show) ] 然后运行python manage.py runserver 效果图如下: [图片上传失败...(image-62414-1531897111035)] [图片上传失败...(image-c715a3-1531897111035)] [图片上传失败...(image-8a6164-1531897111035)] 详细浏览我的博客(https://yq.aliyun.com/users/article?spm=a2c4e.11153940.headeruserinfo.3.24a6291aUNlJjF&do=login) 阿里云大礼包(https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=66enueqz)
接着上一个django创建项目案例1的04继续如下: 定义show.html模板目录如下: show.html代码如下: 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {%for hero in list%} <li>{{hero.hname}}</li> {%endfor%} </ul> </body> </html> 在hero info里随意添加内容如图: 使用模板 编辑views.py文件,在方法中调用模板代码如下: #coding:utf-8 from django.shortcuts import render from django.http import * from .models import * # from django.template import RequestContext,loader # Create your views here. def index(request): # temp = loader.get_template('booktest/index.html') # return HttpResponse(temp.render()) bookList=BookInfo.objects.all() context={'list':bookList} return render(request,'booktest/index.html',context) def show(request,id): book=BookInfo.objects.get(pk=id) herolist=book.heroinfo_set.all() context={'list':herolist} return render(request,'booktest/show.html',context) 知识点介绍 去除模板的硬编码 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/” <a href="{{book.id}}"> 看如下情况:将urlconf中详细页改为如下,链接就找不到了 url(r'^book/([0-9]+)/$', views.detail), 此时的请求地址应该为“127.0.0.1/book/1/” 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效 解决:使用命名的url设置超链接 修改test1/urls.py文件,在include中设置namespace url(r'^admin/', include(admin.site.urls, namespace='booktest')), 修改booktest/urls.py文件,设置name url(r'^book/([0-9]+)/$', views.detail, name="detail"), 修改index.html模板中的链接 <a href="{%url 'booktest:detail' book.id%}"> Render简写 Django提供了函数Render()简化视图调用模板、构造上下文 修改booktest目录下的urls.py文件代码目录如下: 代码如下: #coding:utf-8 from django.conf.urls import url from . import views urlpatterns=[ url(r'^$',views.index), url(r'^(\d+)$',views.show) ] 然后运行python manage.py runserver 效果图如下:
1.Ubuntu18.04 安装采用sudo apt install mysql-server 后,发现在安装过程中没有提示设置root密码,但是登录的时候还要求输入root密码,百度各种,依然没有解决问题。 并且安装MySQL8.0时虽然设置了root密码,但是该密码进不去。 2.首先考虑的就是版本问题,考虑Ubuntu18.04是否还兼容MySQL,问题1中直接用命令安装的话是默认安装MySQL5.7版本。于是去MySQL官网安装指南翻译了一下,发现MySQL刚刚出了新版本8.0,这么凑巧,Ubuntu刚发布了18.04版本,MySQL就发布8.0版本,严重怀疑是因为Ubuntu18.04不支持MySQL5.7了,所以MySQL才发布了8.0版本,为了验证这个问题,在离线安装指南页面发现MySQL5.7版本最高只是适配到Ubuntu17.04,而MySQL8.0最高适配到Ubuntu18.04 3.这就没什么好说的了,只能安装MySQL8.0版本了。在MySQL官网安装指南写的很清楚了,一共就三步,去http://dev.mysql.com/downloads/repo/apt/.下载一个xxxx.deb,然后安装,弹出界面如下图所示,目的是让你选择安装8.0还是5.x版本,当然选择8.0了。 然后sudo apt update更新一下,sudo apt install mysql-server 直接安装就行了,这时你就会发现默认安装的是8.0版本了。 安装到最后会弹出设置root密码的界面,设置好密码后会弹出如下的界面: 命令:linux@ubuntu:~/下载$ sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb linux@ubuntu:~/下载$ sudo apt updatelinux@ubuntu:~/下载$ sudo apt install mysql-serverlinux@ubuntu:~/下载$ mysql -uroot -p密码是:root更详细方法浏览:https://blog.csdn.net/zyqblog/article/details/80159990
首先安装最新版Sublime Text 3 浏览https://www.jianshu.com/p/bf05fb3a4709 实现一下能不能输入中文 再不能的情况下, 请按照以下方法 linux@ubuntu:/usr/local/bin$ subl linux@ubuntu:/usr/local/bin$ sudo rm subl [sudo] linux的密码: linux@ubuntu:/usr/local/bin$ subl linux@ubuntu:/usr/local/bin$ 1.先到/usr/local/bin目录中把subl删除, linux@ubuntu:/usr/share/applications$ subl linux@ubuntu:/usr/share/applications$ sublime linux@ubuntu:/usr/share/applications$ sublime linux@ubuntu:/usr/share/applications$ 2.然后到cd /usr/share/applications的目录下更改权限 linux@ubuntu:/usr/share/applications$ sudo chmod 777 sublime-text.desktop 更改sublime-text.desktop的权限 3.浏览查看更详细方法 http://www.mamicode.com/info-detail-2346923.html linux@ubuntu:~$ which subl /usr/bin/subl linux@ubuntu:~$
继续django创建项目案例1续02的后续 继续项目: 修改index.html代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {%for book in list%} <li>{{book.btitle}}</li> {%endfor%} </ul> </body> </html> 修改views.py文件代码如下: #coding:utf-8 from django.shortcuts import render from django.http import * from .models import * # from django.template import RequestContext,loader # Create your views here. def index(request): # temp = loader.get_template('booktest/index.html') # return HttpResponse(temp.render()) bookList=BookInfo.objects.all() context={'list':bookList} return render(request,'booktest/index.html',context) 效果图:
模板 模板是html页面,可以根据视图中传递的数据填充值 创建模板的目录如下图: 修改settings.py文件,设置TEMPLATES的DIRS值 'DIRS': [os.path.join(BASE_DIR, 'templates')], index.html代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> </body> </html> 修改views.py文件代码: #coding:utf-8 # from django.shortcuts import render from django.http import * from django.template import RequestContext,loader # Create your views here. def index(request): temp = loader.get_template('booktest/index.html') return HttpResponse(temp.render()) 修改settings.py文件代码如下: ROOT_URLCONF = 'test1.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 在终端启动python manage.py runserver 效果图: 修改views.py文件代码同样也可以获得以上效果代码量也减少: #coding:utf-8 from django.shortcuts import render from django.http import * # from django.template import RequestContext,loader # Create your views here. def index(request): # temp = loader.get_template('booktest/index.html') # return HttpResponse(temp.render()) return render(request,'booktest/index.html') 效果图:
后台关联添加 关联对象 对于HeroInfo模型类,有两种注册方式-方式一:与BookInfo模型类相同 -方式二:关联注册 按照BookInfor的注册方式完成HeroInfo的注册 接下来实现关联注册修改admin.py from django.contrib import admin from models import * # Register your models here. class HeroInfoInline(admin.StackedInline): model = HeroInfo extra = 3 class BookInfoAdmin(admin.ModelAdmin): list_display = ['id','btitle','bpub_date'] list_filter = ['btitle'] search_fields = ['btitle'] list_per_page = 1 fieldsets = [ ('base',{'fields':['btitle']}), ('super',{'fields':['bpub_date']}) ] inlines = [HeroInfoInline] admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo) 效果图: 可以将内嵌的方式改为表格 class HeroInfoInline(admin.TabularInline) 修改admin.py from django.contrib import admin from models import * # Register your models here. class HeroInfoInline(admin.TabularInline): model = HeroInfo extra = 3 class BookInfoAdmin(admin.ModelAdmin): list_display = ['id','btitle','bpub_date'] list_filter = ['btitle'] search_fields = ['btitle'] list_per_page = 10 fieldsets = [ ('base',{'fields':['btitle']}), ('super',{'fields':['bpub_date']}) ] inlines = [HeroInfoInline] admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo) 效果图: 视图(views.py) 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf-8 # from django.shortcuts import render from django.http import * # Create your views here. def index(request): return HttpResponse('hello world') 定义完成视图后,需要配置urlconf,否则无法处理请求 URLconf 在Django中,定义URLconf包括正则表达式、视图两部分 Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图 注意:只匹配路径部分,即除去域名、参数后的字符串 在test1/urls.py插入booktest,使主urlconf连接到booktest.urls模块 在booktest下新建一个urls.py文件,然后添加以下代码: #coding:utf-8 from django.conf.urls import url from . import views # url(r'^index$',views.index) 对照效果图看区别 urlpatterns=[ url(r'^$',views.index) ] coding:utf-8 在test1下urls.py文件,然后添加以下代码: from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^',include('booktest.urls')) ] (python manage.py runserver)效果图:
django版本1.8.2pip install django==1.8.2设计介绍本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄图书表结构设计:表名:BookInfo图书名称:btitle图书发布时间:bpub_date英雄表结构设计:表名:HeroInfo英雄姓名:hname英雄性别:hgender英雄简介:hcontent所属图书:hbook图书-英雄的关系为一对多数据库配置在settings.py文件中,通过DATABASES项进行数据库设置django支持的数据库包括:sqlite、mysql等主流数据库Django默认使用SQLite数据库 命令django-admin startproject test1进入test1目录,目录结构如下图: 目录说明manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互内层的目录:项目的真正的Python包_init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包settings.py:项目的配置urls.py:项目的URL声明wsgi.py:项目与WSGI兼容的Web服务器入口 创建应用在一个项目中可以创建一到多个应用,每个应用进行一种业务处理创建应用的命令:python manage.py startapp booktest应用的目录结构如下图 定义模型类models.py 有一个数据表,就有一个模型类与之对应打开models.py文件,定义模型类引入包from django.db import models模型类继承自models.Model类说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长当输出对象时,会调用对象的str方法 代码如下: from django.db import models # Create your models here. class BookInfo(models.Model): btitle=models.CharField(max_length=20) bpub_date=models.DateTimeField() def __str__(self): return self.btitle.encode('utf-8') class HeroInfo(models.Model): hname=models.CharField(max_length=10) hgender=models.BooleanField() hcontent=models.CharField(max_length=1000) hbook=models.ForeignKey(BookInfo) def __str__(self): return self.hname.encode('utf-8') 然后 (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py runserver 8080 生成数据表 激活模型:编辑settings.py文件,将booktest应用加入到installed_apps中 INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest' ) 生成迁移文件:根据模型类生成sql语句 python manage.py makemigrations (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py makemigrations Migrations for 'booktest': 0001_initial.py: - Create model BookInfo - Create model HeroInfo /home/linux/.virtualenvs/python2/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:302: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal return name == ":memory:" or "mode=memory" in force_text(name) (python2) linux@ubuntu:~/桌面/project/test1$ ^C 迁移文件被生成到应用的migrations目录 执行迁移:执行sql语句生成数据表 python manage.py migrate (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py migrate Operations to perform: Synchronize unmigrated apps: staticfiles, messages Apply all migrations: admin, contenttypes, sessions, auth, booktest Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... /home/linux/.virtualenvs/python2/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:302: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal return name == ":memory:" or "mode=memory" in force_text(name) Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying booktest.0001_initial... OK Applying sessions.0001_initial... OK (python2) linux@ubuntu:~/桌面/project/test1$ 测试数据操作 进入python shell,进行简单的模型API练习 python manage.py shell 进入shell后提示如下: (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py shell Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from booktest.models import * >>> b=BookInfo() >>> b.btitle='abc' >>> from datetime import datetime >>> b.bpub_date=datetime(year=1990,month=1,day=12) >>> b.save() /home/linux/.virtualenvs/python2/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1474: RuntimeWarning: DateTimeField BookInfo.bpub_date received a naive datetime (1990-01-12 00:00:00) while time zone support is active. RuntimeWarning) # 查询所有图书信息: >>> BookInfo.objects.all() [<BookInfo: abc>] >>> b=BookInfo.objects.get(pk=1) >>> b.btitle='123' >>> b.save() >>> BookInfo.objects.all() [<BookInfo: 123>] # 删除 >>> b.delete() >>> BookInfo.objects.all() [] 按Ctrl+d退出shell 使用django的管理 创建一个管理员用户 python manage.py createsuperuser,按提示输入用户名、邮箱、密码 启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录 进入管理站点,默认可以对groups、users进行管理 (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py createsuperuser Username (leave blank to use 'linux'): abc Email address: abc@163.com Password: 123 Password (again): 123 Superuser created successfully. /home/linux/.virtualenvs/python2/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:302: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal return name == ":memory:" or "mode=memory" in force_text(name) (python2) linux@ubuntu:~/桌面/project/test1$ python manage.py runserver Performing system checks... System check identified no issues (0 silenced). July 17, 2018 - 09:50:32 Django version 1.8.2, using settings 'test1.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. 在浏览器浏览(http://127.0.0.1:8000/admin/login/?next=/admin/) 管理界面本地化 编辑settings.py文件,设置编码、时区 LANGUAGE_CODE = 'zh-Hans' # 'en-us' TIME_ZONE = 'Asia/Shanghai' # 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 向admin注册booktest的模型 打开booktest/admin.py文件,注册模型 from django.contrib import admin from models import * # Register your models here. admin.site.register(BookInfo) admin.site.register(HeroInfo) 刷新管理页面,可以对BookInfo的数据进行增删改查操作 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误 解决:在str()方法中,将字符串末尾添加“.encode('utf-8')” 自定义管理页面 Django提供了admin.ModelAdmin类 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式 class QuestionAdmin(admin.ModelAdmin): ... admin.site.register(Question, QuestionAdmin) 列表页属性 list_display:显示字段,可以点击列头进行排序 list_display = ['pk', 'btitle', 'bpub_date'] list_filter:过滤字段,过滤框会出现在右侧 list_filter = ['btitle'] search_fields:搜索字段,搜索框会出现在上侧 search_fields = ['btitle'] list_per_page:分页,分页框会出现在下侧 list_per_page = 10 添加、修改页属性 fields:属性的先后顺序 fields = ['bpub_date', 'btitle'] fieldsets:属性分组 fieldsets = [ ('basic',{'fields': ['btitle']}), ('more', {'fields': ['bpub_date']}), ] 修改admin.py from django.contrib import admin from models import * # Register your models here. class BookInfoAdmin(admin.ModelAdmin): list_display = ['id','btitle','bpub_date'] list_filter = ['btitle'] search_fields = ['btitle'] list_per_page = 1 fieldsets = [ ('base',{'fields':['btitle']}), ('super',{'fields':['bpub_date']}) ] admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo) 效果图
django命令 django-admin startproject python manage.py startapp python manage.py makemigrations python manage.py migrate python manage.py runserver python manage.py createsuperuser admin的使用admin.py admin.site.register(模型类.admin类)
首先安装最新版Sublime Text 3 浏览https://www.jianshu.com/p/bf05fb3a4709 实现一下能不能输入中文 再不能的情况下, 请按照以下方法 linux@ubuntu:/usr/local/bin$ subl linux@ubuntu:/usr/local/bin$ sudo rm subl [sudo] linux的密码: linux@ubuntu:/usr/local/bin$ subl linux@ubuntu:/usr/local/bin$ 1.先到/usr/local/bin目录中把subl删除, linux@ubuntu:/usr/share/applications$ subl linux@ubuntu:/usr/share/applications$ sublime linux@ubuntu:/usr/share/applications$ sublime linux@ubuntu:/usr/share/applications$ 2.然后到cd /usr/share/applications的目录下更改权限 linux@ubuntu:/usr/share/applications$ sudo chmod 777 sublime-text.desktop 更改sublime-text.desktop的权限 3.浏览查看更详细方法 http://www.mamicode.com/info-detail-2346923.html linux@ubuntu:~$ which subl /usr/bin/subl linux@ubuntu:~$ image.png image.png
1.Ubuntu18.04 安装采用sudo apt install mysql-server 后,发现在安装过程中没有提示设置root密码,但是登录的时候还要求输入root密码,百度各种,依然没有解决问题。 并且安装MySQL8.0时虽然设置了root密码,但是该密码进不去。 2.首先考虑的就是版本问题,考虑Ubuntu18.04是否还兼容MySQL,问题1中直接用命令安装的话是默认安装MySQL5.7版本。于是去MySQL官网安装指南翻译了一下,发现MySQL刚刚出了新版本8.0,这么凑巧,Ubuntu刚发布了18.04版本,MySQL就发布8.0版本,严重怀疑是因为Ubuntu18.04不支持MySQL5.7了,所以MySQL才发布了8.0版本,为了验证这个问题,在离线安装指南页面发现MySQL5.7版本最高只是适配到Ubuntu17.04,而MySQL8.0最高适配到Ubuntu18.04 2018-07-16 23-59-59屏幕截图.png 3.这就没什么好说的了,只能安装MySQL8.0版本了。在MySQL官网安装指南写的很清楚了,一共就三步,去http://dev.mysql.com/downloads/repo/apt/.下载一个xxxx.deb,然后安装,弹出界面如下图所示,目的是让你选择安装8.0还是5.x版本,当然选择8.0了。 image.png 然后sudo apt update更新一下,sudo apt install mysql-server 直接安装就行了,这时你就会发现默认安装的是8.0版本了。 安装到最后会弹出设置root密码的界面,设置好密码后会弹出如下的界面: image.png 命令: linux@ubuntu:~/下载sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb linux@ubuntu:~/下载 sudo apt update linux@ubuntu:~/下载sudo apt install mysql-server linux@ubuntu:~/下载 mysql -uroot -p 密码是:root 更详细方法浏览:https://blog.csdn.net/zyqblog/article/details/80159990
在Ubuntu16.04版本中使用终端安装MySQL5.7时,按照度娘的教程,搜索如何安装,大多是如下代码: 1 sudo apt-get install mysql-server 2 sudo apt-get install mysql-client 检查MySQL是否运行: sudo netstat -tap | grep mysql 如果成功安装,我的会显示如下内容: tcp 0 0 localhost:mysql : LISTEN 18475/mysqld PS:重启/打开/关闭MySQL的方法是:sudo service mysql restart/start/stop 就这两个命令就安装好了,可是我在安装过程中并没有出现要我写用户名和密码的地方,我一脸懵逼, 完成后在终端输入mysql -u root -p之后,要求我输入密码,可是我并不知道密码,随便输入之后, ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 1 百度了三五个小时,解决方案五花八门,我最后使用有效的方法是: 打开一个文件 sudo vim /etc/mysql/debian.cnf 在这个文件里面有着MySQL默认的用户名和用户密码, 最最重要的是:用户名默认的不是root,而是debian-sys-maint,如下所示 Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhostuser = debian-sys-maint password = Z1fVrmTiZNxxw29o socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = Z1fVrmTiZNxxw29o socket = /var/run/mysqld/mysqld.sock 密码会随即给一个很复杂的,这个时候,要进入MySQL的话,就是需要在终端把root更改为debian-sys-maint,如下代码 mysql -u debian-sys-maint -p 然后终端会提示你输入密码 Enter password: 这是输入文件中的密码即可成功登陆。 当然了,这之后就要修改密码了,毕竟密码太难记。 经过度娘的指导,我所安装的版本是5.7,所以password字段已经被删除,取而代之的是authentication_string字段,所以要更改密码: mysql> update mysql.user set authentication_string=password('password') where user='root'and Host = 'localhost'; 如果显示: Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 则代表成功修改,之后需要重启*MySQL,方可登录成功。 顺便说一下删除MySQL的方法,省的之后再找度娘。 代码如下: sudo apt-get autoremove --purge mysql-server-5.7 sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-get remove mysql-common 上面的可能会有些是多余的,之后需要清理残余数据 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P ################################# 具体查看(https://blog.csdn.net/fr555wlj/article/details/54971412https://blog.csdn.net/weixin_38927796/article/details/79641841https://blog.csdn.net/zyqblog/article/details/80159990 )
sudo apt-get install mysql-server linux@ubuntu:~$ sudo apt-get install mysql-server 7.png
1.输入命令: linux@ubuntu:~$ sudo apt-get install python-virtualenv 2.virtualenv加所想建的项目名字,建立虚拟环境 linux@ubuntu:~$ virtualenv python2 3. 新建一个以python3的虚拟环境: linux@ubuntu:~$ virtualenv -p /home/linux/anaconda3/bin/python py3 linux@ubuntu:~$ cd py3 linux@ubuntu:~/py3$ cd bin (base) linux@ubuntu:~/py3/bin$ source activate 4.新建立虚拟环境管理包: pip install virtualenvwrapper linux@ubuntu:~$ pip install virtualenvwrapper -1.配置virtualenvwrapper linux@ubuntu:~$ sudo find / -name virtualenvwrapper.sh /home/linux/anaconda3/bin/virtualenvwrapper.sh 把路径复制 /home/linux/anaconda3/bin/virtualenvwrapper.sh linux@ubuntu:~$ vim ~/.bashrc 然后在最后一行(快捷键:shift+g) 添加或修改以下代码: export PATH="/home/linux/anaconda3/bin:$PATH" export WORKON_HOME=$HOME/.virtualenvs #RTUALENVWRAPPER_PYTHON='/usr/bin/python3' source /home/linux/anaconda3/bin/virtualenvwrapper.sh 然后保存(:wq), 再 source ~/.bashrc linux@ubuntu:~$ vim ~/.bashrc linux@ubuntu:~$ source ~/.bashrc 然后就可以允许 mkvirtualenv py3. workon 能查看当前有哪些虚拟环境 5.用虚拟环境管理包建立以python2版本来建立虚拟环境: mkvirtualenv --python=/home/linux/anaconda2/bin/python py2 linux@ubuntu:~/.virtualenvs$ mkvirtualenv --python=/home/linux/anaconda2/bin/python py2
例子: pip install django==1.8.2
今天新下了一个Sublime Text3,编辑代码的时候想要用谷歌浏览器查看,默认方法是右键open in browser,但是是在360浏览器打开,然后搜了下步骤是这样的: 1,请看最下面3行话 2,打开编辑器的Preferences”——“Key Bindings—User” 电脑的截图快捷键就是在【F12】键边上的【PRC SC】键。打开一个画图工具cv进去 人家的是这样的: 而我的却是这样的:不懂为什么 打开以后人家的会出现一个空白页,我的却是这样的: 复制代码粘贴进去: //chorme { "keys": ["f2"], "command": "side_bar_files_open_with", "args": { "paths": [], "application": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", "extensions": ".*" } } 解释一下: "keys": ["f2"] : keys:表示快捷键,即 F12 可以启动ie浏览器进行预览。当然你可以设置你喜欢的键,可以给出几个常用按键:alt+F12、ctrl+F12;(我设置的快捷键是f2) "application": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", application:表示浏览器所在的安装路径,只有路径配置正确,才能够正常调用浏览器。而上面的这个路径是本人电脑上的浏览器路径。 查看方式,找到桌面上谷歌浏览器,右键属性打开复制地址: 细心的程序猿们已经发现,我在设置两个浏览器的时候的路径写法不同,一种是用斜杠“/”另一种是用双反斜杠“\\”,其实这两种写法都是正确的,不过如果你写成一个反斜杠“\”那就是错误滴!因为在Windows系统中:反斜杠\,在windows系统中用来表示目录。正斜杠/代表网址、Url地址。而在sublime text中斜杠“/”和双反斜杠“\\”是一个用途的。 还有一个问题,如果你要添加多个浏览器怎么办,其实还是一样的方法,代码也是一样的,只是设置按键和路径的问题了,这里拿火狐来举例: // firefox { "keys": ["f3"], "command": "side_bar_files_open_with", "args": { "paths": [], "application": "D:/Program Files/Mozilla Firefox/firefox.exe", "extensions":".*" } } 设置半天,保存代码以后按f2然而却并没有什么反应???这是为什么,查了半天终于找到问题,就是第一步需要安装一个插件:SideBarEnhancements ctrl+shift+P 转 Package Control: Install Package 搜 SideBarEnhancements 安装。这样快捷键f2启动谷歌浏览器才会起作用!!!