Foghlaim dhomhain agus slándáil dhomhainbhunaithe ar an ngréasán trí shampla

DaisyGrianghraf próifíle '

Le hais Daisy

Foghlaim dhomhain agus slándáil dhomhainbhunaithe ar an ngréasán trí shampla Tríú eagrán Charlotte Harper 3 Iúil, 2024 Nuashonraithe/Athraithe 3 Meitheamh, 2025 Réamhrá: Is cuid thábhachtach de phlean agus de fhorghníomhú aon fhorbróra gréasáin iad na cúinsí slándála i mbogearraí a thógáil don Ghréasán agus fréamhshamhail atá iontaofa, cobhsaí agus úsáideach chun críocha praiticiúla a innealtóireacht. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking Chun am a mharú nó rud éigin a dhéanamh ar an Idirlíon, de ghnáth ar ghléas fóin chliste scáileán tadhaill. Ní bheadh ​​a fhios ag formhór na ndaoine fiú cén áit le tosú nuair a theastaíonn uathu suíomh gréasáin a thógáil ó thús deireadh, bheadh ​​claonadh acu tosú ar shuíomh gréasáin duine eile agus rud éigin a theorannú i bhfeidhmiúlacht, spleáchas, éascaíocht úsáide agus go háirithe cruthaitheacht nuair a d'fhéadfadh siad na huirlisí cumhachtacha is déanaí a bheith acu ar fáil chun rud éigin a thógáil chun rud éigin a thógáil gan a bheith ag iarraidh go n -úsáidfí an t -am ar fad a bhí ag iarraidh a úsáid chun úsáid a bhaint as an úsáid a bhaintear as an úsáid a bhaintear as an úsáid a bhaintear as an bpá agus an t -airgead a úsáid. Má tá cúpla nóiméad agat le léamh tríd an leabhar seo agus a fhoghlaim cad ba mhaith liom a mhúineadh duit, nó fiú labhairt liom go pearsanta faoi do spriocanna agus roinnt treorach a fháil sa treo ceart, agus má tá tú spreagtha le foghlaim conas do bhogearraí féin a chódú agus a scríobh, an leabhar seo a chur ar leataobh sa bhaile agus cuir roinnt ama ar leataobh chun an chéad tionchar, cumhachtach, sruthlínithe agus tábhachtach a chur ar fáil do lucht féachana. Maidir liomsa: Is forbróir bogearraí mé a bhfuil raon leathan taithí agam i C/C ++, Java, Python, HTML, CSS agus JavaScript. Tógfaidh mé suíomhanna gréasáin a theastaíonn ó dhaoine a úsáid, ba mhaith liom cuairt a thabhairt orthu, agus fiú a bheith gafa le húsáid a bhaint as am chun am a fhoghlaim, a athchruthú agus a mharú, agus níos tábhachtaí fós, díolann mé bogearraí. Má bhí smaoineamh agat maidir le conas a theastaigh uait go bhféachfaí ar shuíomh gréasáin agus ar fheidhm, bhí tú toilteanach tacú liom ionas gur féidir liom mo chuid riachtanas féin a chomhlíonadh agus mé ag bualadh leatsa, agus tá tú toilteanach na costais a bhaineann le suíomh gréasáin a reáchtáil duit féin, dhéanfainn an chéad YouTube, Tiktok, Twitter, Google, nó fiú app slándála ardteicneolaíochta a thógáil duit amháin is féidir leat rochtain a fháil ort. In áit a bheith ag iarraidh mo chuid ama a dhíol leat, tá mé ag iarraidh mise a cheannach: Ba mhaith liom labhairt leat i dtógáil aip (láithreán gréasáin) féin leis an bhfaisnéis atá ann cheana féin, agus an méid is gá duit a bheith i do fhorbróir bogearraí, fiontraí neamhspleách, i gceannas ar ghairm bheatha rathúil i cibé réimse is mian leat. Agus lig dom a bheith soiléir, beidh an t -oideachas a thabharfaidh mé duit neamhfhoirmiúil. D'fhéadfá dul ar scoil agus é seo go léir a fhoghlaim le hoideachas foirmiúil, nó fiú an leabhar seo a léamh ar scoil, do thascanna a chomhlánú, agus go leor a bhaint de do chuid oideachais, ach ní chuirfidh mé tú sa suíochán te go foirmiúil agus iarrfaidh mé ort tascanna a chomhlánú. Ní mise do ollamh, is féidir leat smaoineamh ormsa mar chara atá ag iarraidh tú a threorú i dtreo gairme atá á stiúradh ag do rath pearsanta féin. Agus níl rath ort ach an oiread, beidh ort é a cheannach le do chuid ama. Tá cuar foghlama géar ag foghlaim chun cód a fhoghlaim agus ní raibh sé éasca riamh, nó fiú a bheith le bheith. Ní mór duit a bheith ag obair chomh crua agus is féidir leat agus leanúint ar aghaidh ag iarraidh teip agus iarracht a dhéanamh arís fiú nuair a bhíonn frustrachas ort chun apps a fhoghlaim agus a thógáil duit féin. Sin nádúr an chóid féin. Tá an cód á reáchtáil ag tiomsaitheoir atá deartha chun teachtaireachtaí earráide ríomhchláraitheora a thabhairt, agus múinfidh siad seo duit conas cód a dhéanamh, fiú má tá tú díreach ag cóipeáil an earráid isteach i do inneall cuardaigh agus ag léamh samplaí daoine eile. Agus caithfidh mé a rá, ní gá duit a bheith thar a bheith saibhir, cliste, rathúil, nó fiú mionsonraí atá dírithe nó eagraithe chun aip a thógáil. Tugann an ríomhaire aire don eagraíocht sin duit. Ní gá duit ach buanseasmhacht a dhéanamh tríd an triail agus an earráid, fócas a choinneáil agus obair chrua a dhéanamh ar an méid a dhéanann tú, agus beidh gairm an -rathúil agat ar an méid a dhéanann tú. Cé mise: Tuigim go raibh an chuid dheireanach níos mó faoi fhoghlaim agus go dtógfaidh tú bealaí ón leabhar seo. Cé mise go díreach? Is ceist chasta í sin. Nílim soiléir go bhfuil mé féin, mar go bhfuil coinníollacha leighis agam a d'fhéadfadh a bheith deacair dom an leabhar seo a chódú nó a scríobh ag amanna, agus dúshláin á gcur i láthair le saincheisteanna sóisialú agus féiniúlachta a fhágann go bhfuil sé níos deacra mo shaol a thabhairt isteach. I mbeagán focal, má tá an leabhar seo á léamh agat, thug tú abhaile é mar gur iompaigh tú é agus gur shíl tú go raibh sé úsáideach, nó fiú má léann tú é seo i bhfad, is duine cosúil liomsa mé atá ag iarraidh go n -éireoidh leat i ngach rud a dhéanann tú. Is miseInnealtóir mé féin, forbróir bogearraí, agus mac léinn, agus tá an leabhar seo á scríobh agam do mhic léinn eile ar mian leo a saol a dhéanamh níos éasca trí lámhleabhar de na bogearraí a theastaíonn uathu a dhéanamh níos éasca trí shamplaí a thabhairt chun cóip a dhéanamh a oireann le chéile cosúil le bhfreagra mór a bheith ag obair, úsáideach, mór, feidhmiúil, comhleanúnach, agus is féidir leis an aip a thiomáint ar bith. Den chuid is mó, is é seo a dhéanaim: Tógfaidh mé apps chun cabhrú liom féin agus le daoine eile a bheith rathúil. Is údar mé chomh maith, cé gurb é seo mo chéad fhoilseachán a bhfuil sé i gceist agam a chur i gcrích chun mo phunann a chur le chéile i ndoiciméad úsáideach, agus is ealaíontóir mé chomh maith. Admhóidh mé é seo duit, is duine aisteach mé. Níl mé foirfe, bhí INS á reáchtáil agam leis an dlí fiú a threoraigh mé chun coláistí agus ollscoileanna a fhágáil agus stáit a fhágáil chun iarracht a dhéanamh ainm a dhéanamh dom féin le níos mó ratha. Is bean mé de réir breithe, caithim makeup, tóg grianghraif díom féin, caitheann mé gúnaí agus éadaí ban eile, agus fanann mé feasach orm féin mar bhean de réir nádúir. Bhí fadhbanna agam le daoine eile san am atá thart as a leanann deacrachtaí le scríbhneoireacht agus le tógáil WebApps, agus gabhaim leithscéal nach raibh mé in ann an leabhar seo a fháil i do lámha níos luaithe: bhí gá agat leis seo. Beidh tú ag iarraidh cód a léamh agus a scríobh atá cosúil le mianach agus a oibríonn mar mhianach agus a dhéanann an rud céanna ach níos fearr fós, mar más féidir leat an leabhar seo a cheannach in ionad do mhéarchlár a mhaolú mar is féidir liom leabhar a chruthú duit féin ag iarraidh airgead dó, tá na hacmhainní a theastaíonn uait chun a bheith rathúil i do shaol. Bhí gach cineál saincheisteanna agam le teaghlaigh ag fás aníos, coinníollacha sláinte, dochtúirí, na meáin, agus an dlí, agus léiríonn mo chód go mór an streachailt atá i gceist le feimineachas agus nádúr na mban i ndomhan roinnte agus frustrated. Mar sin féin, is mór an cúram dom an leabhar seo, mo leanbh, mo phunann, agus mo shlí bheatha, mar sin tuigim do bhreithniú nuair a thógann tú an téacs abhaile agus go cúramach é chun foghlaim uaim. Coinnigh i gcuimhne nach bhfuil mé foirfe, beidh earráidí, athbhreithnithe, agus eagráin nua ag an leabhar seo, agus beidh ort smaoineamh ar do inchinn loighciúil chomh maith agus is féidir leat chun taithí rathúil a bheith agat le mo chuid scríbhneoireachta. Chomh maith leis sin, tuigim go bhfuil i gceist agam go maith duit fiú nuair a bhíonn dúshláin romhat agus tú ag scríobh. Smaoinigh air mar seo: nuair is féidir leat córas ríomhaireachta a fháil ar cíos chun aon rud a dhéanamh is féidir leat a shamhlú sa spás digiteach, an fhaisnéis go léir a bhíonn agat a stóráil, é a anailísiú agus a eagrú, agus teacht chun é a thuiscint, beidh deacrachtaí agat leis an bhfaisnéis atá á n -ionghabháil agat agus fiú a fhoilsiú. Deirim leat seo toisc go bhfaigheann mé na deacrachtaí céanna. Bain úsáid as an leabhar seo ar do phriacal féin, oibrigh le do phobal agus le do phobail atá ar fáil duit chun bogearraí a thógáil laistigh de shuíomh sábháilte, agus ná tóg rudaí go pearsanta nuair a theipeann ort nó nuair a éiríonn leat fiú ar an mbealach mícheart: sin an chaoi a bhfuair mé é seo go dtí seo, agus cén fáth ar féidir liom an téacs seo Oibreoidh sé, an tIdirlíon. B'fhéidir nach mbeadh tú an -eolach ar cé mé féin le cúpla focal, ach molaim duit léamh ar aghaidh, gheobhaidh tú aithne orm agus tú ag leanúint ar aghaidh ag léamh agus ag tuiscint dom agus tú ag tógáil do thionscadail féin chun do chuid oibre a chríochnú. Ní bheidh aon obair bhaile leis an leabhar seo, chomh fada is nach sannann do ollamh nó do mhúinteoirí aon rud duit, ach molaim go mór duit punann de thionscadail a thógáil duit féin agus tú ag léamh, chomh maith le tionscadal caipín a thaispeánann conas is féidir leat an méid atá foghlamtha agat a chur i bhfeidhm. Is é mo thionscadal capstone an bunús leis an gcuid is mó de na rudaí a léifidh tú sa leabhar seo, mar go gcuimsíonn sé cód ó mo thionscadail roimhe seo, cód a chruthaigh mé agus a d'fhoghlaim mé chun scríobh go modúil de láimh, agus raon leathan smaointe agus leideanna a chabhraigh liom go n -éireoidh liom an pointe inar féidir liom app simplí a chasadh suas agus a fhéachann go hiomlán agus a fhéachann agus a iompraíonn tú mar a bheadh ​​tú ag úsáid do chara nó ag úsáid, ar an Idirlíon, nó a fhágann go bhfuil tú in ann do chara a úsáid. Cad é an leabhar seo: Is rang teagaisc é an leabhar seo trí shampla. Is féidir leat cód a fháil anseo, treoracha maidir le conas cód a fhoghlaim, eolas a fháil ar chód dífhabhtaithe agus earráidí a shocrú, céimeanna fabhtcheartaithe, treoracha maidir le conas cúltaca a dhéanamh agus do chód a ath-imscaradh má bhriseann duine ar bith do chód, do chód a úsáid, do chód a úsáid, láithreáin ghréasáin idirghníomhacha a thógáil, a bhfuil tú ag léiriú, agus go dtabharfaidh tú an t-app, agus go mbeidh tú in ann, cén fáth a bhfuil tú, cén fáth a bhfuil tú, agus go bhfuil tú ag léiriú, cén fáth a bhfuil tú, cén fáth a bhfuil tú, agus go mbeidh tú in ann an t-íomhá, agus go bhféadfá a bheith i do íomhá, agus go mbeidh tú in ann an t-íomhá, agus go bhféadfá a chur i dtaisce, agus go bhféadfá a chur in iúl, agus go mbeidh tú i do chuid féin, agus go bhféadfá a chur in iúl, agus go bhféadfá a chur in iúl, agus go bhféadfá a chur in iúl, agus go bhféadfá do chód a chur in iúl, agus go mbeidh tú ag súil le do chuid eile, Mar na bogearraí a thógann tú sa solas iomlán is fearr le bheith ar an gceann is tarraingtí agus is féidir do do chuid úsáideoirí deiridh, cuairteoirí do láithreán gréasáin. Sa leabhar seo, taispeánfaidh mé roinnt samplaí de dhearadh bogearraí le fócas ar an ngréasán mar ardán chomh maith le slándáil. Cuirfimid tús leis an bhfoghlaimfíneáil
Pembelajaran dan Keamanan Deep Berdasarkan Web Praktis

Pembelajaran dan Keamanan Deep Berdasarkan Web Praktis Edisi ketiga Charlotte Harper 3 Juli 2024 Diperbarui/dikonversi 3 Juni 2025

Kata pengantar:

Pertimbangan keamanan dalam membangun perangkat lunak untuk web adalah bagian penting dari rencana pengembang web dan eksekusi setiap saat merekayasa prototipe yang dapat diandalkan, stabil, dan berguna untuk tujuan praktis. DOM (Markup Objek Dokumen), dengan implementasi HTML, JavaScript, dan CSS serta perangkat lunak backend yang mengimplementasikan Python, C/C ++, Java dan Bash, memberi pengembang web kebebasan dan kekuatan untuk menciptakan berbagai proyek yang mengekspresikan kreativitas, memberikan banyak penggunaan dan fungsi yang menarik, dan merupakan kemudahan yang memanfaatkannya sebagai kemudahan yang baik, dan seperti yang dapat digunakan sebagai kemudahan yang dapat digunakan sebagai hal yang baik, dan karakter sebagai kemudahan yang memanfaatkan penggunaan, dan karakter sebagai kemudahan yang memanfaatkan dengan mudah, dan karakter sebagai kemudahan yang memanfaatkan penggunaan, dan memberikan banyak penggunaan. Bunuh waktu atau selesaikan sesuatu di internet, biasanya di perangkat smartphone layar sentuh. Kebanyakan orang bahkan tidak akan tahu dari mana harus memulai ketika mereka ingin membangun situs web dari awal, mereka akan cenderung memulai di situs web orang lain dan membangun sesuatu yang terbatas dalam fungsionalitas, ketergantungan, kemudahan penggunaan dan terutama kreativitas ketika mereka dapat memiliki semua alat kuat terbaru yang mereka miliki untuk membangun sesuatu yang berguna tanpa menggunakan tombol waktu, dan terutama dengan mudahnya membayar dengan mudah untuk menggunakan sih yang ingin digunakan oleh beberapa orang untuk menggunakan perangkat lunak yang ingin dimanfaatkan oleh beberapa orang. Jika Anda memiliki beberapa menit untuk membaca buku ini dan mempelajari apa yang ingin saya ajarkan kepada Anda, atau bahkan berbicara dengan saya secara pribadi tentang tujuan Anda dan mendapatkan beberapa panduan ke arah yang benar, dan termotivasi untuk belajar membuat kode dan menulis perangkat lunak Anda sendiri, bawa pulang buku ini dan sisihkan beberapa waktu untuk membangun apa yang Anda inginkan dan persis apa yang Anda inginkan.

Tentang saya: Saya seorang pengembang perangkat lunak dengan berbagai pengalaman dalam C/C ++, Java, Python, HTML, CSS dan JavaScript. Saya membangun situs web yang ingin digunakan orang, ingin berkunjung, dan bahkan kecanduan hanya menggunakan hanya untuk belajar, menciptakan kembali dan menghabiskan waktu, dan yang paling penting, saya menjual perangkat lunak. Jika Anda memiliki ide tentang bagaimana Anda ingin situs web terlihat dan berfungsi, Anda bersedia mendukung saya sehingga saya dapat memenuhi kebutuhan saya sendiri sementara saya bertemu dengan milik Anda, dan Anda bersedia menutupi biaya menjalankan situs web sendiri, saya akan membangun Anda di YouTube berikutnya, Tiktok, Twitter, Google, atau bahkan aplikasi keamanan teknologi tinggi yang hanya dapat Anda akses. Alih -alih mencoba menjual waktu saya kepada Anda, saya mencoba membeli milik Anda: Saya ingin membujuk Anda untuk membangun aplikasi (situs web) sendiri dengan informasi yang sudah ada, dan mengajari Anda apa yang Anda butuhkan untuk menjadi pengembang perangkat lunak independen, pengusaha, memimpin karier yang sukses di bidang apa pun yang Anda inginkan. Dan biarkan saya jelas, pendidikan yang saya berikan kepada Anda akan informal. Anda bisa pergi ke sekolah dan mempelajari semua ini dengan pendidikan formal, atau bahkan membaca buku ini di sekolah, menyelesaikan tugas Anda, dan mengambil banyak dari pendidikan Anda, tetapi saya tidak akan secara resmi menempatkan Anda di kursi panas dan meminta Anda untuk menyelesaikan tugas. Saya bukan profesor Anda, Anda dapat menganggap saya seperti teman yang ingin membimbing Anda menuju karier yang didorong oleh kesuksesan pribadi Anda. Dan saya juga tidak menjual kesuksesan Anda, Anda perlu membelinya dengan waktu Anda. Belajar kode memiliki kurva belajar yang curam dan tidak pernah mudah, atau bahkan seharusnya. Anda perlu bekerja sekeras mungkin dan terus mencoba dan gagal dan mencoba lagi bahkan ketika Anda frustrasi untuk belajar dan membangun aplikasi sendiri. Itu adalah sifat kode itu sendiri. Kode dijalankan oleh kompiler yang dirancang untuk memberikan pesan kesalahan programmer, dan ini akan mengajarkan Anda cara membuat kode, bahkan jika Anda hanya menyalin kesalahan ke mesin pencari Anda dan membaca contoh orang lain. Dan saya harus mengatakan, Anda tidak perlu menjadi sangat kaya, pintar, sukses, atau bahkan berorientasi pada detail atau terorganisir untuk membangun aplikasi. Komputer mengurus organisasi itu untuk Anda. Anda hanya perlu bertahan melalui coba -coba, mempertahankan fokus dan bekerja keras pada apa yang Anda lakukan, dan Anda akan memiliki karier yang sangat sukses secara keseluruhan dari apa yang Anda lakukan.

Siapa saya: Saya menyadari bahwa bagian terakhir lebih banyak tentang belajar dan Anda mengambil jalan dari buku ini. Siapa sebenarnya saya? Itu pertanyaan yang rumit. Saya tidak jelas pada diri saya sendiri, karena saya menderita kondisi medis yang dapat menyulitkan saya untuk bahkan membuat kode atau menulis buku ini di kali, sambil menghadirkan tantangan dengan sosialisasi dan masalah identitas yang membuat hidup saya lebih sulit ketika datang untuk memperkenalkan diri. Singkatnya, jika Anda membaca buku ini, Anda membawanya pulang karena Anda membalikkannya dan berpikir itu berguna, atau bahkan jika Anda hanya membaca sejauh ini, kepada Anda, saya adalah individu yang berpikiran seperti yang ingin melihat Anda berhasil dalam segala hal yang Anda lakukan. Saya seorang insinyur sendiri, pengembang perangkat lunak, dan seorang siswa, dan saya menulis buku ini untuk siswa lain yang ingin membuat hidup mereka lebih mudah dengan memiliki buku pegangan perangkat lunak yang mereka butuhkan membuat hidup mereka lebih mudah dengan memberikan contoh untuk menyalin yang cocok bersama seperti aplikasi besar ke dalam lini bisnis yang berfungsi, bermanfaat, fungsional, kohesif, dan menarik yang dapat mendorong keberhasilan apa pun lini bisnis. Sebagian besar, inilah yang saya lakukan: Saya membangun aplikasi untuk membantu diri saya dan orang lain berhasil. Saya juga seorang penulis, meskipun ini adalah publikasi pertama saya yang ingin saya selesaikan untuk menggabungkan portofolio saya menjadi dokumen yang berguna, dan saya juga seorang seniman. Saya akan mengakui ini untuk Anda, saya semacam orang yang aneh. Saya tidak sempurna, saya telah menjalankan Ins dengan hukum bahkan membuat saya meninggalkan perguruan tinggi dan universitas dan meninggalkan negara bagian untuk mencoba membuat nama untuk diri saya sendiri dengan lebih sukses. Saya seorang wanita sejak lahir, saya memakai riasan, mengambil foto diri saya, memakai gaun dan pakaian wanita lainnya, dan saya tetap sadar akan diri saya sebagai wanita secara alami. Saya memiliki masalah dengan orang lain di masa lalu yang mengarah pada perjuangan dengan menulis dan membangun aplikasi web, dan saya minta maaf bahwa saya belum bisa mendapatkan buku ini di tangan Anda lebih cepat: Anda membutuhkan ini. Anda akan ingin membaca dan menulis kode yang terlihat seperti milik saya dan bekerja seperti milik saya dan melakukan hal yang sama tetapi bahkan lebih baik, karena jika Anda mampu membeli buku ini alih -alih menumbuk keyboard Anda seperti yang saya lakukan hanya untuk membuat buku sendiri meminta uang untuk itu, Anda memiliki sumber daya yang Anda butuhkan untuk berhasil dalam hidup Anda. Saya memiliki segala macam masalah dengan keluarga yang tumbuh, kondisi kesehatan, dokter, media, dan hukum, dan kode saya sangat mencerminkan perjuangan yaitu feminisme dan sifat perempuan di dunia yang terpecah dan frustrasi. Namun, buku ini adalah sesuatu yang sangat saya pedulikan, bayi saya, portofolio saya, dan mata pencaharian saya, jadi saya menghargai pertimbangan Anda ketika Anda membawa pulang teks dan dengan hati -hati meneliti untuk belajar dari saya. Harap diingat bahwa saya tidak sempurna, buku ini akan memiliki kesalahan, revisi, dan edisi baru, dan Anda perlu berpikir dengan otak logis Anda sebaik mungkin untuk memiliki pengalaman yang sukses dengan tulisan saya. Juga, pahami bahwa saya bermaksud baik untuk Anda bahkan ketika Anda menghadapi tantangan saat menulis. Pikirkan seperti ini: Ketika Anda hanya dapat menyewa sistem komputer untuk melakukan apa pun yang dapat Anda bayangkan di ruang digital, menyimpan semua informasi yang Anda temui, menganalisis, dan mengaturnya, dan mulai memahaminya, Anda pasti akan menghadapi kesulitan dengan informasi yang Anda konsumsi dan bahkan menerbitkan. Saya memberi tahu Anda ini karena saya mengalami kesulitan yang sama. Gunakan buku ini dengan risiko Anda sendiri, bekerja dengan komunitas dan komunitas Anda yang tersedia untuk Anda untuk membangun perangkat lunak dalam lingkungan yang aman, dan jangan mengambil sesuatu untuk secara pribadi ketika Anda gagal atau bahkan berhasil dengan cara yang salah: Begitulah cara saya sampai sejauh ini, dan mengapa saya dapat membawa Anda ke dalam hal -hal yang akan terjadi pada semua hal yang terjadi pada semua hal yang membuat saya hancur dan terkena hal -hal global yang membuat saya hancur dan terkena dampak global. di mana kita akan bekerja, internet. Anda mungkin tidak terlalu akrab dengan siapa saya hanya dengan beberapa kata, tetapi saya mendorong Anda untuk membaca, Anda akan mengenal saya ketika Anda terus membaca dan memahami saya sambil membangun proyek Anda sendiri untuk menyelesaikan pekerjaan Anda. Tidak akan ada pekerjaan rumah dengan buku ini, selama profesor atau guru Anda tidak memberikan Anda apa pun, tetapi saya sangat mendorong Anda untuk membangun portofolio proyek sendiri saat Anda membaca, serta proyek batu penjuru yang menampilkan bagaimana Anda dapat menerapkan apa yang telah Anda pelajari. Proyek Capstone saya adalah dasar untuk sebagian besar dari apa yang akan Anda baca dalam buku ini, karena menggabungkan kode dari proyek saya sebelumnya, kode yang telah saya buat dan belajar untuk menulis secara metodis dengan tangan, dan berbagai ide dan tips yang telah membantu saya berhasil ke titik di mana saya dapat memutar aplikasi yang sepenuhnya ditampilkan dan terlihat dan berperilaku seperti aplikasi yang mungkin Anda lihat.

Apa buku ini: Buku ini adalah tutorial dengan contoh. Anda dapat menemukan kode di sini, instruksi untuk bagaimana belajar kode, informasi tentang kode debugging dan memperbaiki kesalahan, pemecahan masalah, instruksi tentang cara mencadangkan dan menyimpan kode Anda, menggunakan kembali jika ada yang memecahkan kode Anda, mengamankan kode Anda, menyebarkan kode Anda, seperti halnya Anda, seperti halnya Anda, seperti halnya Anda, dan membuat Anda tidak perlu melakukan apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun, dan membuat Anda memiliki apa pun yang penting, dan membuat Anda tidak masuk akal. Perangkat lunak yang Anda bangun dengan cahaya terbaik mutlak untuk menjadi yang paling menarik bagi pengguna akhir Anda, pengunjung situs web Anda. Dalam buku ini, saya akan mendemonstrasikan sejumlah contoh desain perangkat lunak dengan fokus pada web sebagai platform serta keamanan. Kami akan memulai pengalaman belajar dengan membangun proyek dasar menggunakan unix shell, dengan fitur cadangan dan skrip. Kemudian, kami akan memeriksa situs web blog dasar, meningkatkan blog kami dengan fitur foto dan video serta menggunakan fitur ini untuk menggunakan solusi keamanan menggunakan perangkat lunak gratis, dan mengamankan server kami menggunakan Modul Otentikasi Pluggable (PAM). Kami kemudian akan meninjau penanganan dan pemrosesan file, mengeksplorasi pengeditan video, donasi suara, pemindaian barcode dan pengenalan karakter optik, di antara konsep -konsep lainnya. Sepanjang jalan kami akan memeriksa API yang akan membantu kami membuat perangkat lunak kami lebih berguna dan aman, dengan opsi gratis dan berbayar. Sepanjang jalan, kami akan menjelajahi keamanan fisik dan alat militan seperti senjata api dan desain amunisi dan manufaktur termasuk desain barel dan repeater, desain menara dan drone, dan kepala sekolah lainnya yang akan kami integrasikan dengan perangkat lunak kami di jaringan yang ada untuk melindungi perangkat lunak kami dan menunjukkan pertahanan diri dan resillience. Kami akan beristirahat di sepanjang jalan untuk membangun game, mesin rendering 2D dan 3D, dan bekerja dengan perangkat keras tertanam dalam contoh studi kasus perangkat lunak rendering dimensi dasar dan masing -masing pemijat yang bergetar elektronik dalam karet silikon. Sepanjang jalan, kami juga akan menggunakan solusi pembelajaran mesin yang sudah tersedia untuk lebih mengamankan perangkat lunak kami. Kami juga akan menggunakan alat stok yang tersedia untuk Web untuk merampingkan dan mengamankan proses. Buku ini adalah panduan untuk kesuksesan Anda dalam membangun aplikasi web dan mengintegrasikannya dengan jaringan komputer profesional dan sistem mekanik tertanam, dan secara keseluruhan panduan untuk membangun perangkat lunak dan perangkat keras tertanam tanpa pengetahuan latar belakang atau pengalaman sebelumnya.

Buku ini bukan: Jika Anda benar -benar ingin memiliki situs web, Anda bisa membuat toko sederhana dan menjual apa yang Anda butuhkan, memposting blog, memposting foto atau video, atau tanpa pernah menulis satu baris kode. Buku ini bukan itu. Buku ini akan mengajari Anda cara membangun perangkat lunak yang lebih berguna, sepenuhnya unggulan, fungsional dan aman daripada perangkat lunak apa pun yang sudah dapat Anda temukan, karena menggunakan perangkat lunak terbaru yang masih prototipe, mungkin mahal untuk dijalankan pada skala perusahaan yang lebih tua yang beroperasi, dan tidak menarik untuk mundur, perusahaan yang berbelit -belit didirikan untuk menghasilkan uang untuk orang -orang yang tidak benar -benar melakukan apa pun. Jika Anda mengikuti buku ini dengan cermat, Anda akan ingin menulis kode, kode penelitian, membangun aplikasi Anda sendiri, dan Anda akan menghasilkan uang dari apa yang Anda lakukan. Saya akan menghasilkan uang dari buku ini, bahkan pada tahap awal, karena berisi informasi yang dibutuhkan orang dan ingin membaca, dan sudah membeli ketika mereka membeli atau menggunakan aplikasi saya. This book won't build an app for you, but it will point you in the right direction and arm you with the tools you need and the skills and tips that will facilitate your own success in building software for the web, with every line of code you will need to write as an example, ready to be pieced together into software you and your supporters, guests, clientele, friends, family, visitors, contractors, and the people of the internet want to use and support.

Apa yang akan Anda pelajari: Buku ini akan mengajari Anda cara membangun dan menjual perangkat lunak, sangat fungsional, perangkat lunak yang berguna, perekaman media, fitur keamanan seperti pengenalan wajah, pemindaian kode batang zona yang dapat dibaca mesin, API Web untuk mengotentikasi, merekam dan membuat video dan foto, dan bertukar pesan seperti Bluetooth dan komunikasi Field Near Field (NFC). Buku ini akan mengajarkan Anda cara menggunakan komputer jaringan, dengan fokus pada Debian Linux, cara membangun kode bash untuk menjadikan pemasangan dan mencadangkan perangkat lunak Anda dengan angin yang mulus, otomatis, cara membangun kode python sebagai backend untuk melayani pesan dinamis, gaya -hal dengan baik menggunakan verifikasi lain dengan fitur -fitur yang berinteraksi dengan Bootstrap, memungkinkan login pengguna dan interaktivitas yang berinteraksi dengan baik, untuk melakukan verifikasi dengan versi dengan verifikasi dengan versi dengan versi dengan verifikasi dengan versi dengan versi dengan versi dengan versi dengan versi lain dengan website, mengaktifkan login pengguna dan interaktivitas interaktivitas, dengan gaya versi dengan baik, untuk verifikasi dengan verifikasi dengan versi lain dengan website dengan bootstrap, memungkinkan login pengguna dan interaktivitas interaktivitas, dengan gaya versi dengan baik dengan verifikasi dengan verifikasi dengan versi lain dengan webs. Tujuan, pemindaian ID, moderasi gambar dan video, transaksi data untuk menjaga perangkat lunak Anda aman, pemrosesan pembayaran, perdagangan cryptocurrency, tugas asinkron, dan banyak lagi. Anda akan belajar cara membangun perangkat Bluetooth Anda sendiri, dengan baterai, pengisi daya, mikrokontroler, sirkuit, motor dan sensor, menggunakan solder, kawat, dan dicetak 3D serta bahan cor. Saya akan mendemonstrasikan prinsip -prinsip desain 3D yang diterapkan pada manufaktur dan alat aditif dan pembuatan die, sehingga Anda dapat memproduksi perangkat perangkat keras tertanam Anda sendiri dengan baterai terintegrasi, pengisi daya, sirkuit elektronik, dan output fungsional. dan jaringan mereka dengan Bluetooth dan Web. Secara khusus, kami akan memeriksa dua studi kasus, pemijat yang bergetar dan senjata api buatan sendiri, keduanya diprogram di OpenScad, yang tersedia sebagai antarmuka grafis atau utilitas baris perintah dan dapat diintegrasikan ke dalam web untuk hasil yang lebih cepat. Anda akan belajar cara membangun dan menggunakan situs web dari bawah ke atas tanpa pengalaman sebelumnya, membuatnya fungsional, aman, indah, bermanfaat dan paling penting praktis. Anda akan belajar cara menggunakan pembelajaran mesin dan visi komputer untuk membuat situs aman dan lebih praktis, merekam video dan audio dari situs web Anda, menyumbangkan suara Anda, membuat musik dan memodulasi audio untuk membuat sampel yang bermanfaat, dan cara memecah kebisingan dengan memanfaatkan semua situs web lain untuk membangun jaringan terbaik yang Anda tautkan secara langsung ke Anda untuk berbagi semua informasi berguna yang Anda tawarkan, dan bahkan lebih penting lagi. Buku ini akan sangat terfokus pada media, keamanan, dan pembelajaran mesin, yang merupakan tiga komponen utama yang akan membantu Anda membangun perangkat lunak yang berguna untuk web dengan melibatkan pengguna yang tepat dan melepaskan yang salah dengan cara yang realistis, praktis, langsung dan menarik sementara juga otomatis, dan kokoh. Buku ini mengajarkan UNIX, khususnya Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript, dan sejumlah paket perangkat lunak yang berguna untuk permintaan seperti Python, serta perangkat lunak bash yang berguna seperti GIT dan FFMPEG. Saya juga akan mengajari Anda cara menukar cryptocurrency secara otomatis, dan mengambil pembayaran dalam cryptocurrency atau dari kartu debit biasa sambil bahkan membayar pengunjung Anda bagian dari pendapatan Anda jika Anda memilih untuk melakukannya. Saya akan mengajari Anda cara menghasilkan uang dari situs web Anda melalui iklan juga, cara menyiapkan aplikasi Anda untuk mesin pencari dan membuatnya cepat, peringkat peringkat pertama untuk apa yang akan dicari pelanggan Anda untuk menemukan Anda, dan peringkat dalam sebanyak mungkin pencarian umum. Saya akan mengajari Anda cara menjual perangkat lunak Anda, mengiklankannya, menarik bagi klien yang mencari layanan Anda, dan membuat nama untuk diri Anda sendiri di internet melalui jalan yang sudah ada, murah, dan bekerja dengan baik. Saya akan mengajari Anda cara menyimpan data Anda di komputer cloud yang cocok untuk Anda dan menyimpan data Anda dengan murah, cara merencanakan dan membangun situs web yang melakukan apa yang diinginkan pengguna Anda dan apa yang Anda inginkan, dan bagaimana membuat pengguna Anda tetap terlibat dengan meletakkan situs Anda ke ponsel mereka hanya dengan pemberitahuan, email, pesan teks, panggilan telepon, dan lebih banyak jalan untuk membawa pengguna Anda hanya untuk membawa kembali ke situs web Anda di situs Anda. Buku ini akan fokus pada kepraktisan menerbitkan dan mendistribusikan media dalam jumlah besar, dari teks ke foto hingga video hingga audio, membuat kesan yang baik pada pengguna akhir (klien Anda), dan menjual diri Anda dengan cara apa pun yang Anda lakukan untuk membuat situs web, aplikasi yang sebaik mungkin. Anda juga akan mempelajari beberapa tips dan trik dari saya, dari kiat pengkodean, kesombongan praktis seperti makeup dan fotografi, pemodelan dan akting, dan banyak lagi, yang akan penting untuk menggambarkan diri Anda dan perusahaan Anda dalam cahaya terbaik menggunakan semua alat yang tersedia untuk Anda sambil mendistribusikan lebih banyak konten seperti yang Anda butuhkan di seluruh keseimbangan yang sehat dari platform untuk membawa perangkat lunak Anda ke fruisi tanpa upaya lebih dari, atau lebih dari upaya, atau bekerja, atau bekerja, atau bekerja, atau bekerja, atau bekerja. Buku ini berjudul "PraktisWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Peningkatan, captioning gambar, dan tugas-tugas lain seperti metrik prediksi yang bersumber dari gambar, seperti sifat gambar sebagai gambar otentik, yang ditransfer komputer, atau salinan optik (foto yang dapat Anda lakukan, tetapi juga ada yang dikenakan pada Anda. dengan wajah Anda. menggunakan). Siapa pun yang membangun perangkat lunak yang sangat aman memiliki perasaan tentang apa yang disiratkan. Perangkat lunak secara inheren tidak aman karena perangkat dan akun yang kami gunakan untuk mengaksesnya tidak selalu siap membantu kami, mereka bisa berada di tangan siapa pun dengan niat buruk untuk perangkat lunak dan karenanya dapat menimbulkan risiko pada perangkat lunak itu sendiri. Ini adalah sesuatu dari fokus buku ini. Komputer jaringan secara default diamankan dengan token kunci yang panjang, dipanggil dan kunci shell SSH atau aman, dan sebaliknya diamankan dengan server web, karena server web menyediakan akses terbuka serta alat keamanan canggih yang berjalan di server itu sendiri. Server web memiliki akses ke browser web pengguna, yang bisa dibilang bagian paling kuat dari perangkat pengguna, karena itu adalah tempat di mana pengguna dapat mengakses perangkat lunak jaringan. Toolkit ini dapat memberikan teks, halaman web yang Anda lihat, dan juga dapat merekam gambar, audio dan video (seperti foto wajah atau ID negara), dapat membaca dan menulis ke perangkat radio Bluetooth, dan dapat membaca dan menulis ke dekat tag transponder lapangan, web yang dimasukkan ke dalam webse dan web yang dibaca dengan data yang dibaca dan dibaca dengan data, dan bahkan tag -nomor seri yang dapat dibaca. Menggunakan semua alat yang Anda miliki, dengan buku ini Anda akan melengkapi diri Anda dengan pengetahuan untuk membangun situs web yang aman, dan secara keseluruhan sistem komputer jaringan yang aman yang bekerja untuk Anda, melakukan penawaran Anda, dan terlihat dan terasa

Tempat Memulai: Anda dipersilakan untuk melewati bagian yang saya mulai buku ini, atau bagian apa pun, dengan kode tepat yang Anda butuhkan, terutama jika Anda memiliki pengalaman dengan pengkodean sebelum atau alat yang disebutkan di atas yang akan saya gambarkan secara rinci dalam buku ini serta mendokumentasikan kasus penggunaan dan contoh -contoh praktisnya. Jika Anda tidak memiliki pengalaman dalam menulis kode, saya sangat menyarankan Anda membaca semua buku ini, dan terutama merekomendasikan Anda membaca bagian sebelumnya, untuk memastikan buku ini tepat untuk Anda. Jika buku ini tidak tepat untuk Anda, pertimbangkan untuk memberi hadiah kepada teman atau kerabat yang mungkin tertarik untuk belajar tentang pengembangan web sendiri, dan bahkan mempertimbangkan untuk meminjamnya kembali dan belajar dari mereka untuk mengisi celah di mana saya gagal sebagai guru, atau guru lain yang dilakukan sebelum saya. Mulailah di mana Anda mau, setiap bagian dari buku ini akan berguna jika Anda berniat membangun aplikasi yang bermanfaat, dan menganggap bahwa aplikasi terbaik dibangun dengan mempertimbangkan pengguna akhir: Ketahui pelanggan Anda. Sekarang Anda mengenal saya, Anda tahu buku ini, dan Anda siap untuk memulai. Untuk memulai, ambil komputer (bahkan laptop termurah dari toko kotak, Amazon, atau desktop tua berfungsi, dan mengaturnya dengan cara yang cocok untuk Anda.

Cara membaca buku ini: Teks disorot, menunjukkan bahwa teks tersebut termasuk dalam prompt perintah, di mana Anda akan menulis kode yang Anda jalankan. Perintah prompt sangat terfokus ke keyboard dan membutuhkan sedikit atau tidak ada mengklik, mempercepat alur kerja Anda dan membuat segalanya lebih mudah pada Anda.

Memulai: Mari selami. Kita akan mulai dengan membangun kode di mesin lokal dan mulai tanpa membangun situs web yang terhubung ke internet. Ini lebih aman untuk memulai, tidak ada biaya, dan mudah bagi Anda. Bergantung pada sistem operasi Anda, masuk ke shell bash akan sedikit berbeda. Untuk Mac OS, saya sarankan menginstal mesin virtual pada saat ini, karena Anda akan mendapatkan kompatibilitas paling banyak dengan mesin virtual. Berbagai penyedia seperti VirtualBox dan Paralells dapat menjalankan mesin virtual untuk Anda, meskipun juga dimungkinkan untuk menginstal Ubuntu secara langsung di mesin, jika Anda lebih suka menggunakan lingkungan asli yang direkomendasikan untuk membuat pengalaman yang cepat dan ramping. Jika Anda menggunakan Linux atau Windows, yang saya rekomendasikan, harus sangat mudah untuk membuat proyek. Buka terminal Anda, sesuaikan ukuran sesuai keinginan Anda, dan mulailah mengikuti langkah 2. Jika Anda menggunakan Windows, silakan ikuti langkah 1.

Langkah 1: - Pengguna Windows saja Di Windows, buka command prompt sebagai administrator dan ketik WSL - instalasi

Langkah 2: - Lanjutkan di sini, atau lewati langkah 1 ke sini jika Anda tidak menggunakan Windows Di terminal terbuka, (tergantung pada OS Anda, yang disebut Ubuntu di Windows, Terminal di Mac atau Linux, atau nama serupa), mulailah dengan membuat proyek. Kami melakukan ini dengan perintah MKDIR, yang membuat direktori. Jika Anda perlu membuat direktori untuk menyimpan proyek Anda, yang disarankan, gunakan perintah CD untuk mengubah ke direktori dan dan dan

CD/PATH/TO/Direktori - Path adalah folder (file) yang mendahului direktori tujuan Anda, jalur default Anda adalah ~ atau/home/nama pengguna (di mana nama pengguna adalah nama pengguna Anda). Untuk mengubah ke direktori default, ketik CD atau CD ~ Contoh mkdir - ganti "contoh" dengan nama direktori

Sekarang Anda memiliki direktori yang berfungsi untuk proyek Anda. Karena sangat penting untuk disimpan direktori ini jika Anda perlu beralih ke mesin yang berbeda atau menggunakan kode yang Anda tulis sehingga siap untuk web, kami akan membangun skrip untuk mencadangkan direktori Anda dalam beberapa langkah berikutnya. Tetapi membangun skrip membutuhkan sedikit kode, dan kode harus diotomatisasi agar bermanfaat. Jadi mari kita bangun skrip untuk membuat skrip terlebih dahulu. Mari kita mulai dengan membuat skrip dan membuatnya dapat dieksekusi. Kami akan menggunakan sudo, chmod, dan menyentuh untuk ini, dan memanggil skrip "Ascript".

Sudo Touch/USR/Bin/Askripsi sudo chmod a+x/usr/bin/naskah sudo nano/usr/bin/naskah

Sekarang kami telah membuat skrip, membuatnya dapat dieksekusi, dan siap mengeditnya. Nano adalah editor teks yang akan memungkinkan Anda mengedit teks tanpa mengklik, yang jauh lebih mudah daripada menggunakan antarmuka pengguna grafis. Untuk mengedit file dengan nano, gunakan nano dan kemudian jalur ke file. Untuk membuat skrip yang membuat skrip, itu cukup mirip dengan membuat skrip kami di tempat pertama. Kami akan menggunakan kode yang sama seperti di atas, mengganti nama skrip, "Ascript" dengan parameter argumen, $ 1. Ini memungkinkan kami memanggil skrip dengan mengetikkan nandript Sudo Ascript, pada titik mana kami dapat membuat skrip baru dengan mengganti "nawit" dengan nama skrip Anda. Kode di Nano seharusnya terlihat seperti:

Sudo Touch/usr/bin/$ 1 sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1

Dan untuk menutup Nano, kita dapat menahan tombol kontrol dan menekan x, lalu y untuk menunjukkan bahwa kita sedang menyimpan file, dan tekan kembali. Sekarang alih -alih mengetik ketiga perintah ini untuk mengedit skrip, kita akan dapat mengetikkan sudo Ascript Ascript untuk mengedit skrip lagi. Ini berhasil! Dan skrip baru apa pun dapat dijalankan dengan mudah dengan menyebutnya di shell. Mari kita simpan pekerjaan kita sekarang: Mari kita tulis skrip cadangan untuk menyimpan skrip baru kita dan kemudian mendukungnya di direktori proyek kita, sementara juga mencadangkan skrip cadangan.

Sudo Ascript Backup

Sekarang, di Nano:

sudo cp/usr/bin/backup/path/to/directory/ Sudo CP/USR/BIN/ACRIPS/PATH/TO/Direktori/

Where/Path/To/Directory adalah jalur menuju proyek yang Anda buat dengan MKDIR. Kemudian kita akan belajar cara menyalin jalur berulang seperti ini dengan loop dan daftar, yang lebih sedikit kode, tetapi untuk sekarang mari kita tetap sederhana dan memiliki beberapa baris. Untuk menjalankan skrip ini dan cadangkan kode Anda, simpan file di nano dengan kontrol+x, y dan kembali, dan ketik di bawah ini ke dalam shell Anda

cadangan

Jika Anda diminta sama sekali untuk kata sandi saat membaca buku ini dan mengikuti di shell, silakan masukkan kata sandi pengguna Anda dengan benar, Anda akan memiliki tiga percobaan sebelum Anda perlu menjalankan kembali perintah. Anda dapat menggunakan panah atas dan bawah untuk menukar perintah dan mengeditnya, jika Anda perlu menjalankan apa pun dua kali. Sederhana tekan naik dan turun sebentar -sebentar untuk memilih perintah, sebelum mengedit perintah dengan kanan, panah kiri dan menghapus tombol serta keyboard, dan menjalankannya dengan kembali.

Selamat! Anda berhasil membuat skrip cadangan yang luar biasa yang mencadangkan dua skrip shell penting di direktori kerja Anda. Kita mungkin memindahkan barang -barang nanti karena proyek semakin besar, tetapi ini berhasil untuk saat ini. Mari kita beralih ke cadangan di cloud, kami akan menggunakan GitHub untuk ini (meskipun ada banyak solusi git lainnya untuk cadangan, semuanya hampir sama.) Git adalah perangkat lunak kontrol Verision yang memungkinkan Anda mendukung pengeditan ke perangkat lunak Anda saat Anda membuat mereka ke server, sementara juga memungkinkan Anda untuk mengunduh seluruh salinan perangkat lunak Anda di balik kata sandi atau kunci. Ini sangat berperan dalam menyimpan perangkat lunak Anda, terutama saat kami bermigrasi ke instance Linux yang mengamankan yang kadang -kadang pecah ketika satu baris kode gagal, membuat Anda terkunci sementara kode Anda mungkin tidak dicadangkan jika Anda tidak mendapatkan kesempatan untuk mendukungnya secara otomatis, yang akan kami liput.

Jika Anda belum menggunakan mesin virtual Ubuntu pada saat ini, saya merekomendasikan menggunakan mesin virtual Ubuntu pada saat ini karena itu akan membuat hidup Anda lebih mudah ketika menginstal semua paket yang diperlukan untuk membangun situs web yang berfungsi dan membentuk operasi pembelajaran mendalam di komputer Anda. Kami akan memindahkan kode ke server web dalam waktu dekat, tetapi kami ingin memastikan ada setidaknya beberapa lapisan keamanan di belakang server web kami yang tahan terhadap phishing, dan menggunakan sejumlah paket Linux untuk melakukan ini. Jika Anda masih ingin menggunakan Mac OS, Anda dipersilakan untuk mencari dan menginstal paket yang diperlukan secara online, tetapi mungkin tidak ada alternatif untuk setiap paket yang akan dicakup buku atau seri ini.

Mari kita tambahkan beberapa perintah untuk melakukan pekerjaan kita dengan skrip cadangan dengan menjalankan cadangan Cadangan Sudo Sudo.

# ... git add –all git komit -m "cadangan" Git Push -u Origin Master

...

Sekali lagi, kontrol x untuk menyimpan.
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Sekarang kita perlu melakukan konfigurasi satu kali untuk proyek ini. Karena ini akan segera menjadi proyek git, kita tidak perlu mengetik setiap perintah setiap kali kita menggunakan dari repositori git, tetapi kita akan memahami ini ketika kita menulis skrip penyebaran kita. Untuk memulai, mari kita pastikan kita berada di direktori yang tepat dan menginisialisasi repositori git dan menghasilkan tombol SSH.

CD/PATH/TO/Direktori init git Git Branch -M Master ssh-keygen

Setelah kami mengetik ssh-keygen, kunci baru harus disimpan di folder home di bawah folder yang disebut .ssh. Ini disebut id_rsa.pub. Mari kita temukan kunci ini dan salin. Untuk melihatnya,
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
CD ~ Cat .ssh/id_rsa.pub

Salin teks yang dikembalikan oleh perintah terakhir, dan buat akun dengan penyedia git Anda (idealnya github), sebelum menambahkan kunci ssh ke akun Anda. Setelah Anda memiliki akun, klik menu kanan atas dan masukkan pengaturan, sebelum menambahkan tombol SSH Anda di tombol SSH dan GPG di bawah akses di menu. Pilih Tambahkan Kunci SSH dan tambahkan milik Anda dengan menempelkannya dan memberikannya judul, sebelum menyimpan dan kembali ke GitHub untuk membuat repositori baru. Ini serupa untuk penyedia git lainnya, Anda harus membaca dokumentasi mereka. Dalam konfigurasi repositori baru, berikan nama deskriptif repositori Anda dan putuskan apakah Anda ingin mempublikasikannya, dan pastikan untuk mengkonfigurasi belum ada file untuk dimasukkan. Setelah repositori dibuat, salin klon dengan URL SSH, dan tempel ke perintah berikut.

Git Remote Add Git: //… (URL jarak jauh Anda)
sudo ascript backup
Sekarang Anda dapat kembali ke repositori Anda dengan CD, Anda akan terbiasa dengan ini. Coba skrip cadangan Anda sekarang dengan cadangan

Besar! Sekarang kita benar -benar bisa mendapatkan pengkodean. Mari kita pasang Django sekarang karena kita memiliki pemahaman yang baik tentang bash dan git. Django akan membiarkan kami secara otomatis mendukung perangkat lunak kami, Bash dapat melakukan ini juga tetapi Django harus memiliki implementasi yang lebih aman yang lebih aman (dapat dinonaktifkan dan dikonfigurasi dengan lebih mudah).

Untuk menginstal perangkat lunak di Ubuntu, kami akan menggunakan perintah sudo apt-get. Pertama, mari kita perbarui dan tingkatkan perangkat lunak yang sudah kami miliki. Ini dapat dilakukan dengan pembaruan sudo apt-get dan upgrade sudo apt-get -y. Selanjutnya, mari kita menginstal Python dan lingkungan virtual kami, rumah kode kami, dengan perintah berikut: sudo apt-get menginstal python-is-python3 python3-venv
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Ini semua yang Anda butuhkan untuk pergi dengan Django dalam hal pemasangan perangkat lunak dalam contoh Ubuntu. Untuk Windows dan Linux ini harus cukup mudah, tetapi untuk Mac Anda mungkin ingin menginstal mesin virtual dan Linux di atasnya menggunakan lingkungan virtual gratis atau berbayar seperti VirtualBox atau Paralells Desktop dan menciptakan kembali langkah -langkah di atas untuk mengatur lingkungan Ubuntu. Ubuntu sangat penting dalam hal ini karena itu adalah perangkat lunak yang dijalankan situs web dan memungkinkan mereka untuk meng -host situs web dengan semua perangkat lunak yang disebutkan di atas.

Mari kita gali ke dalam Django.

Di direktori kami lagi, dengan CD:
backup
Python -M Venv Venv # Membuat Lingkungan Virtual Di mana Kode Disimpan Sumber venv/bin/activate # mengaktifkan lingkungan virtual Pip Instal Django Django-Admin StartProject mysite. # Where MySite adalah proyek yang saya mulai di direktori saya saat ini.

Menciptakan lingkungan virtual di mana kode disimpan

Mengaktifkan lingkungan virtual

Di mana tempat saya adalah proyek yang saya mulai di direktori saya saat ini.

Django baru saja memulai, karena Django menjadi tuan rumah server web dan melakukan semua yang kita butuhkan untuk menjalankan dan menjalankan situs web lokal. Sekarang setelah kami menginstal Django, mari kita mengedit pengaturan sedikit untuk membuatnya berfungsi seperti yang kita butuhkan. Pertama, mari kita buat aplikasi baru

python kelola.py startapp feed

Anda akan melihat aplikasi pertama disebut feed. Aplikasi harus dipanggil apa pun yang Anda suka, dan kami akan membuat aplikasi baru, tetapi nama setiap aplikasi harus konsisten setiap kali aplikasi dirujuk dalam kode. Untuk menambahkan aplikasi baru, kami akan selalu mengedit settings.py di direktori lain aplikasi yang dibuat, dinamai di startProject, selanjutnya aplikasi. Menggunakan nano,

nano app/settings.py

Di pengaturan, temukan installed_apps dan pisahkan [] menjadi 3 baris. Menggunakan empat spasi di garis tengah kosong, tambahkan 'feed', atau nama aplikasi Anda. Bagian dari pengaturan ini. PYPY akan terlihat seperti:
# Installed_apps = [
    'memberi makan',
]
Sebelum kita lupa, mari kita uji bahwa Django bekerja. Menggunakan perintah python kelola.py runserver 0.0.0.0:8000, kita dapat menjalankan server dan kemudian menavigasi di browser web di komputer yang menjalankan kode ke http: // localhost: 8000 dan melihat contoh halaman web (itu berfungsi!) Keluar dari server dengan kontrol c, sama seperti perintah lainnya.

Sekarang, mari kita gali menulis beberapa kode Python. Django memiliki tiga komponen utama, semuanya dijalankan dengan kode sepenuhnya. Komponen disebut model, tampilan dan templat, dan masing -masing berada pada level yang lebih tinggi dan lebih rendah masing -masing sebelum halaman web dikirimkan ke pengguna.

Model ini adalah kode yang menyimpan informasi dalam database untuk pengambilan, sortasi dan rendering.

Tampilan memutuskan bagaimana model ini diberikan, dimanipulasi, dan dimodifikasi, hampir setiap tampilan akan menggunakan model secara langsung.

Templat adalah kode HTML dengan beberapa lonceng dan peluit tambahan yang disebut bahasa template. Template diterjemahkan oleh pandangan di mana ia diisi dengan kode python dan konteks seperti model dan informasi (string dan bilangan bulat) dari tampilan.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Django juga memiliki komponen lain, termasuk tetapi tidak terbatas pada:

Pengaturan, yang mengkonfigurasi aplikasi seperti yang kita bahas.

URL, yang merupakan pola yang diikuti pengguna untuk mendapatkan akses ke bagian -bagian tertentu dari aplikasi web.
cd ~
cat .ssh/id_rsa.pub
Formulir, yang menentukan bagaimana informasi yang dikirim ke server ditangani dan diterjemahkan ke database serta kepada pengguna. Ini adalah dasar dari pemrosesan informasi di sisi server, dan dapat menerima semua jenis informasi yang disimpan komputer, terutama string teks, angka, dan boolean benar/palsu (biasanya kotak centang).

Templat, yang merupakan kode HTML dan bahasa templat dan menjembatani kesenjangan antara Python dan HTML, yang berarti informasi Python dapat disajikan sebagai kode HTML yang dapat diakses siapa pun dan dapat mengamankan situs web dengan akses terbatas, sambil membuat kode Python dapat diakses ke web dan berguna untuk berbagai tujuan pada perangkat jarak jauh yang tidak perlu ada di dekat server.

File statis, yang biasanya merupakan javascript dan perpustakaan yang dilayani dan ditautkan oleh server dengan templat.
git remote add git://… (your remote URL)
File media, yang disajikan server atau di -host secara eksternal, atau hanya ditulis ke server sebelum diproses dan diposting ke server lain (ember) untuk hosting.

Middleware, yang merupakan potongan kode yang dijalankan pada saat yang sama dengan setiap tampilan dan dianggap "termasuk" dalam tampilan.

Prosesor konteks, yang memproses konteks setiap tampilan dan digunakan untuk menambahkan konteks tambahan.

Tes, yang memvalidasi bahwa pengguna atau permintaan melewati persyaratan tertentu sebelum tampilan diberikan.

Konsumen, yang menentukan bagaimana websockets menangani dan menanggapi komunikasi.

Admin, yang digunakan untuk mendaftarkan model sehingga dapat dimanipulasi secara rinci dalam halaman admin Django, di mana basis data dapat dikelola melalui antarmuka grafis.

Celery, yang mendefinisikan tugas -bagian asinkron bagian -bagian dari kode Django dapat mulai berjalan sebelum segera melanjutkan ke tugas atau baris kode berikutnya.

Django dapat memiliki banyak komponen lain, yang akan kita bahas secara rinci di sini. Ada banyak cara untuk membuat Django lebih fungsional, menambahkan websockets, yang merupakan saluran komunikasi yang cepat dan ramping, seledri, yang mengeksekusi tugas asinkron, dan banyak perangkat lunak lainnya untuk memperluas Django, terutama dalam fungsi tampilan, di mana sebagian besar kode dieksekusi. Fungsi tampilan adalah kunci karena mereka biasanya mendeklarasikan setiap bagian kode yang khusus untuk pola URL tertentu, atau bagian dari server.

Pertama, mari kita jelajahi fungsi tampilan. Fungsi tampilan dimulai dengan impor yang menunjukkan kode yang akan digunakan dalam tampilan, dan didefinisikan menggunakan definisi atau kelas fungsi reguler. Tampilan paling sederhana didefinisikan oleh definisi definisi def, dan mengembalikan httprespons dengan templat dasar. Mari kita mulai dengan mendefinisikan pandangan dasar untuk mengembalikan teks "Hello World". Ingatlah bahwa setiap kali Anda menambahkan kode setelah pernyataan seperti DEF, jika, sementara, untuk, dll, Anda perlu menambahkan 4 ruang untuk setiap definisi sebelumnya yang ingin Anda terapkan pada fungsi Anda. Kami akan membahas apa artinya masing -masing segera.

Dari direktori situs kami, edit file feed/views.py menggunakan nano dan tambahkan baris berikut ke akhir file.

dari django.http impor httpresponse def hello (permintaan): return httpresponse ('hello world')

HTTPResponse Django merespons dengan string teks, dilambangkan dengan pembukaan dan penutupan '. Setiap kali Anda meneruskan informasi ke fungsi atau kelas, seperti permintaan atau string, Anda perlu menggunakan tanda kurung (, membuka dan menutup).

Ini belum semua yang kita butuhkan untuk melihat pandangan kita. Tentu saja, kami belum memberi tahu server di mana tampilan tepatnya, kami masih perlu mendefinisikan jalur yang harus diterjemahkan oleh tampilan. Mari kita mulai dengan mendefinisikan jalur dasar di aplikasi/urls.py, dan kita akan masuk ke grup jalur nanti.
python -m venv venv # Di App/Urls.py, tambahkan baris setelah pernyataan impor setelah awal mengimpor tampilan yang baru saja kami buat.
source venv/bin/activate # dari tampilan impor umpan sebagai feed_views
django-admin startproject mysite . # Sekarang, mari kita tentukan pola tampilan. Pola tampilan memiliki tiga komponen, komponen jalur, yang memberi tahu server di mana tampilan ada di dalam server (jalur URL tempat pengguna mengetik ke bilah navigasi untuk memasukkan halaman web), komponen tampilan di mana tampilan ditentukan, dan nama yang ramah untuk diubah dan lebih mudah untuk diubah. Masuk akal untuk melakukan hal -hal seperti ini dan menjadi fleksibel, karena basis kode Anda akan menjadi lingkungan yang terus berubah yang membutuhkan fleksibilitas dan improvisasi agar berharga dan mudah dikerjakan. Inilah tampilan Anda nantinya, Anda dapat menambahkan ini ke urlpatterns = [bagian aplikasi/urls.py. Pola tampilan didefinisikan dengan tiga komponen yang dijelaskan di atas, dan fungsi yang disebut jalur. Pola URL Anda adalah daftar, jadi pastikan untuk selalu mengakhiri setiap item di dalamnya dengan koma, karena ini memisahkan masing -masing. Setiap item juga harus menggunakan baris baru, sekali lagi dengan empat spasi sebelumnya, seperti aplikasi di settings.py. Kami akan menentukan komponen pertama tampilan dengan fungsi string kosong, untuk membuat tampilan yang berjalan pada direktori root server web. Urls.py Anda sekarang harus terlihat seperti ini:
dari tampilan impor umpan sebagai feed_views Urlpatterns = [ path ('', feed_views.hello, name = 'hello'), ]

Ini adalah dasar untuk membuat situs web dengan Django yang sepenuhnya statis. Untuk membuat situs web yang lebih dinamis di mana kita dapat memulai informasi caching, seperti gambar, video, audio dan banyak lagi, kita perlu menggunakan model, yang akan kita jelajahi selanjutnya. Untuk saat ini, mari kita periksa kode kami dan jalankan server. Untuk memeriksa kode untuk kesalahan, jalankan:

Python Manager.py Check
python manage.py startapp feed
Jika ada pesan kesalahan, Anda harus hati -hati meninjau perubahan yang Anda buat ke aplikasi Anda dan melihat apakah ada sesuatu yang perlu diperbaiki, seperti ruang asing atau kurang, karakter tambahan, string yang tidak tertutup, kesalahan ketik apa pun, karakter apa pun yang dihapus secara tidak sengaja, atau apa pun. Membaca pesan kesalahan (jika Anda memilikinya), Anda harus dapat melihat jalur ke file yang Anda buat atau edit bersama dengan nomor baris, jadi lihat ke dalam file dan baris itu dan lihat apakah Anda dapat memperbaiki apa pun yang ada di sana. Jika Anda telah memperbaiki masalah, jalankan perintah di atas lagi. Ketika perangkat lunak Anda siap berjalan dan berfungsi, Anda akan melihat output "Pemeriksaan sistem diidentifikasi tidak ada masalah." Sekarang Anda siap untuk pergi. Jalankan server dengan:

python manager.py runserver 0.0.0.0:8000

Sekarang buka browser web dan navigasikan ke http: // localhost: 8000. Anda harus melihat teks yang dikembalikan dalam tanda kurung dan kutipan fungsi HTTPRESPONSE dalam pandangan Anda. Ini hanya contoh dasar, tetapi jika Anda berhasil sejauh ini, Anda memahami dasar -dasar bagaimana Linux, Bash, Python, dan Django bekerja. Mari kita gali lebih dalam dalam beberapa pemodelan basis data, dan jelajahi kekuatan kelas Python dalam menyimpan informasi. Kemudian, kita akan mulai menguasai HTML dan CSS sebelum kita membuat situs kita sepenuhnya ditampilkan, fleksibel dan aman menggunakan JavaScript dan pembelajaran mesin.
nano app/settings.py
Kelas disimpan di model.py aplikasi Anda. Menggunakan nano, edit aplikasi/model.py dan tambahkan kelas baru. Kelas didefinisikan dengan definisi kelas dan disahkan superclass yang diwarisi, dalam hal ini model.model. Nama kelas muncul setelah definisi kelas, dan setelah definisi kelas A: (usus besar) digunakan, sebelum atribut dan definisi fungsi yang terkait dengan kelas dilambangkan di bawah ini. Kelas kami membutuhkan ID yang dapat kami gunakan untuk mengambilnya dan membuatnya unik, dan juga membutuhkan bidang teks untuk menyimpan beberapa informasi. Kemudian kita dapat menambahkan cap waktu, file, boolean (definisi benar atau salah yang dapat membantu kode kita membuat keputusan tentang apa yang harus dilakukan dengan model, dan dapat digunakan untuk mengurutkannya), sebuah instance untuk mengikat model ke pengguna yang masuk ke server, dan banyak lagi. Mari kembangkan kode di bawah ini:

dari model impor django.db # impor yang digunakan untuk mendefinisikan kelas kami dan atributnya Posting kelas (model.model): # Definisi kelas kita sendiri id = model.autofield (primer_key = true) # ID model kami, kunci yang dihasilkan secara otomatis yang akan memungkinkan kami menanyakan model, tetap unik, dan berguna ketika kami perlu berinteraksi dengan model setelah dibuat. text = model.textField (default = '') # Atribut yang disimpan kelas kami, dalam hal ini, beberapa teks, default ke string kosong.

Impor yang digunakan untuk mendefinisikan kelas kami dan atributnya
INSTALLED_APPS = [
    'feed',
]
Definisi kelas kita sendiri

ID dari model kami, kunci yang dihasilkan secara otomatis yang akan memungkinkan kami menanyakan model, tetap unik, dan berguna ketika kami perlu berinteraksi dengan model setelah dibuat.

Atribut toko kelas kami, dalam hal ini, beberapa teks, default ke string kosong.

Tutup dan simpan file seperti yang kami lakukan sebelumnya untuk menyelesaikannya.

Ada banyak bidang dan opsi lain yang akan kami jelajahi ketika kami memperbarui kelas ini seiring perkembangan aplikasi kami, tetapi ini adalah kebutuhan dasar untuk membuat aplikasi untuk memposting beberapa teks. Namun, model ini tidak akan bekerja sendiri. Seperti yang dijelaskan sebelumnya, kami akan membutuhkan tampilan khusus dan pola URL khusus untuk membuat model ini berfungsi, dan kami juga membutuhkan formulir bersama dengan templat. Mari kita jelajahi formulir terlebih dahulu.

Untuk mendefinisikan formulir, edit aplikasi/forms.py dengan nano dan tambahkan baris berikut. Kami akan membutuhkan dua impor, kelas formulir kami, serta model yang kami buat (feed.models.post), definisi kelas yang mirip dengan model, dan bidang bersama dengan subkelas yang disebut meta yang akan menentukan model yang berinteraksi dengan formulir. Formulir ini juga dapat memiliki fungsi inisialisasi yang mengaturnya berdasarkan informasi dalam permintaan, model atau sebaliknya, kami akan mengeksplorasi ini nanti.

Bentuk model sangat berguna karena mereka dapat membuat model atau juga mengedit model, jadi kami akan menggunakannya untuk keduanya. Mari kita tentukan satu di forms.py di bawah ini.

Dari formulir impor Django dari feed.models impor pos Class Postform (forms.modelform): Text = Forms.charfield (widget = forms.TextArea) Meta kelas: model = post bidang = ('teks',)

Ini adalah dasar dari seperti apa bentuk dan model itu. Bentuk model ini dapat digunakan untuk membuat instantiate atau mengedit posting, mengubah teks yang dikandungnya. Kami akan melihat mengintegrasikan formulir ini ke dalam tampilan berikutnya. Pertama, mari kita buat migrasi dan migrasi database sehingga kode kita dapat berinteraksi dengan model saat berjalan. Untuk melakukan ini, jalankan perintah berikut:

Python Manager.py Makemigrasi Python Manager.py Migrasi

Ini akan memakan waktu satu menit untuk dieksekusi, tetapi begitu terjadi, itu akan memungkinkan Anda untuk mengakses model di tampilan, middleware, atau di mana pun di perangkat lunak. Mari kita lanjutkan dengan membuat tampilan di mana kita dapat melihat model kita. Edit feed/views.py dan tambahkan kode berikut, sebagaimana dicatat. Anda tidak perlu menambahkan apa pun setelah tanda #, kode itu adalah komentar yang digunakan untuk menunjukkan informasi tentang kode tersebut. Kami akan mulai dengan mengimpor model kami dalam tampilan, dan menambahkannya ke konteks di mana kami dapat menjadikannya dalam templat sebagai daftar untuk ditampilkan. Selanjutnya, kami akan menambahkan templat di mana kami dapat membuat formulir dan model dengan tombol untuk membuat objek baru berdasarkan model dan mempostingnya ke server. Ini kedengarannya rumit, jadi mari kita ambil langkah demi langkah. Sebelum kita menyelesaikan tampilan, mari kita buat templat yang hanya membuat model dan pastikan kita dapat melihatnya dengan membuat posting baru di shell. Beginilah tampilan itu seharusnya:

dari feed.models impor pos dari django.shortcuts impor render, redirect dari django.urls impor terbalik Def feed (permintaan): Posts = Post.Objects.all () # Permintaan semua posting di database sejauh ini return render (permintaan, 'feed/feed.html', { 'Posting': Posting, })

Permintaan semua posting dalam database sejauh ini

Ini semua terlihat sangat sederhana sampai kita sampai ke bawah. Render, nilai yang dikembalikan oleh fungsi alih -alih dalam respons HTTP seperti contoh sebelumnya, selalu mengambil permintaan sebagai input pertama, menerima konteks (dalam hal ini posting dalam database), yang sekarang dapat diterjemahkan dalam templat, dan mengembalikan templat yang ditentukan dalam fungsi. Templat akan menjadi dokumen HTML dengan sedikit bahasa yang disebut Jinja2, yang menjadikan informasi Python ke dalam HTML.

Untuk mulai membuat template, buat dua direktori dalam feed.

MKDIR FEED/TEMPLATE MKDIR FEED/TEMPLATE/FEED

Selanjutnya, edit templat di direktori di atas, umpan/templat/pakan, dan tambahkan kode untuk contoh ini. Mari kita lihat templat untuk contoh ini.

Memberi makan { % untuk posting di posting %} {{Post.Text}} { % endfor %}

Ini adalah templat yang sangat sederhana. Ini mendefinisikan pembukaan dan penutupan tag HTML, tag tipe dokumen, tag tubuh dengan judul legenda, tag break yang menambahkan garis kecil di layar, dan loop yang membuat setiap posting dalam daftar posting sebagai paragraf di templat. Hanya ini yang diperlukan untuk membuat posting, tetapi belum ada dalam database. Mari kita buat beberapa dengan shell. Kita bisa menjalankan shell dengan kelola.py

python kelola.py shell

Sekarang, mari kita impor model posting kita

dari feed.models impor pos

Selanjutnya, kami akan membuat posting sederhana dengan string dan keluar dari shell. String bisa apa saja, selama itu teks yang valid.

Post.Objects.create (Text = 'Hello World') KELUAR()

Terakhir, kita perlu menambahkan pola URL ke pakan kita. Karena aplikasi umpan kami akan menggunakan beberapa URL dan kami ingin menjaga ukuran file kecil, mari kita buat URLS lokal di aplikasi feed kami yang terlihat seperti ini:

dari jalur impor django.urls dari . Impor tampilan Urlpatterns = [ path ('', views.feed, name = 'feed'), ]

Kami juga perlu mengedit urls.py di aplikasi dasar, apa pun yang kami putuskan untuk menyebutnya, ini adalah direktori pertama yang kami buat. Edit aplikasi/app.py dan tambahkan yang berikut ini ke pola URL

dari impor Django.urls termasuk # di atas Urlpatterns = [ #... kode sebelumnya di sini path ('feed/', include (('feed.urls'), namespace = 'feed')), ]

di atas

... kode sebelumnya di sini

Sekarang, ketika kami menjalankan server dengan python manager.py runserver, kami akan melihat halaman yang kami buat karena kami memiliki model, tampilan dan templat serta pola URL, bersama dengan item dalam database. Selanjutnya, mari kita terapkan formulir yang kami buat dan mulai membuat posting kami sendiri. Tetapi sebelum kita menulis terlalu banyak kode, mari kita buat cadangan menggunakan skrip yang kita tulis sebelumnya, cadangan. Jalankan skrip ini di shell, tunggu beberapa saat, dan semua kode akan didukung ke repositori git kami.

cadangan

Menerapkan formulir relatif sederhana. Kami akan mengimpor formulir kami, menambahkan penangan permintaan pos ke tampilan, dan menyimpan pos di database sebelum mengarahkan ulang ke tampilan yang sama. Kita dapat menggunakan fungsi pengalihan yang sudah kita impor, dan fungsi lain yang disebut terbalik untuk mendapatkan URL untuk pola tampilan. Kami akan menanyakan ini dengan string 'feed: feed' karena namespace dari pola yang disertakan adalah umpan, dan pandangan juga disebut feed.

dari feed.forms impor postform Def feed (permintaan): Posts = Post.Objects.all () # Permintaan semua posting di database sejauh ini Jika request.method == 'Post': # Tangani Permintaan Posting Formulir = postform (request.post) # Buat instance formulir dan simpan data ke sana jika form.is_valid (): # validasi formulir form.save () # simpan objek baru return redirect (reverse ('feed: feed')) # redirect ke URL yang sama dengan permintaan get return render (permintaan, 'feed/feed.html', { 'Form': postform (), # Pastikan untuk meneruskan formulir ke dalam konteks sehingga kita dapat membuatnya. 'Posting': Posting, })

Permintaan semua posting dalam database sejauh ini

Tangani Permintaan Posting

Buat instance formulir dan simpan data untuk itu

Validasi formulir

Simpan objek baru

Redireksi ke URL yang sama dengan permintaan GET

Pastikan untuk meneruskan formulir ke dalam konteks sehingga kita dapat membuatnya.

Tag dalam html dan render formulir di template html dengan tombol kirim. Kami juga akan membutuhkan token CSRF, token yang mencegah situs eksternal dari posting ke formulir tanpa terlebih dahulu memuat halaman.

Memberi makan { % csrf_token %} {{ membentuk }} Posting baru { % untuk posting di posting %} {{Post.Text}} { % endfor %}
from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Mari kita hancurkan ini. Ada kelas bentuk baru, token, formulir itu sendiri, dan tombol kirim. Cukup sederhana, tetapi ketika kita melihatnya, kita mungkin ingin membuatnya terlihat lebih baik. Ini berfungsi, kami dapat memposting posting baru dengan formulir dan sekarang disimpan dalam database. Ada beberapa hal yang terjadi di sini. Kami menggunakan tag HTML untuk menyatakan bahwa dokumen tersebut adalah dokumen HTML, kami menggunakan tag template ({ % ... %}) untuk membuat token untuk formulir, dan yang lain, {{...}} untuk membuat formulir. Kami juga memiliki loop untuk membuat teks menggunakan tag blok dan tag template. Tag blok sangat penting karena kita dapat mendefinisikan bagaimana bagian dari template diterjemahkan dengan mereka, dan tag template adalah dasar dari bagaimana kita memasukkan variabel ke dalam kode kita.

Sekarang kita perlu membuat aplikasi kita terlihat lebih baik, karena untuk saat ini terlihat sangat mendasar. Kita dapat melakukan ini dengan menggunakan CSS, baik inline, atau di kelas yang terikat pada setiap objek dalam dokumen. CSS sangat bagus karena menceritakan semuanya di halaman bagaimana tampilannya, dan bisa membuatnya terlihat sangat bagus. Ada beberapa perpustakaan yang dapat melakukan ini, tetapi orang saya pergi adalah Bootstrap.

getbootstrap.com/

Buat direktori baru yang disebut templat dengan template mkdir, dan kemudian edit templat/base.html.

Seharusnya terlihat seperti ini:

{ % Block Body %} { % endblock %}

Pastikan untuk menyalin file CSS dan JavaScript, file .css dan .js, karena kami akan membutuhkan JavaScript untuk membuat situs kami lebih fungsional di masa mendatang.
from feed import views as feed_views
Sekarang, mari kita kembali ke shell bash dan jalankan perintah cepat. Ingat, jika Anda perlu mengakses lingkungan virtual, ketik sumber venv/bin/aktifkan. Ini akan memungkinkan Anda menginstal paket Python secara lokal dengan cara yang memungkinkan Django mengaksesnya. Untuk memberikan formulir kami yang dihasilkan oleh kelas bootstrap Django, kami akan menggunakan paket Python yang disebut Formulir Crispy. Kami dapat mengunduh ini dengan perintah berikut

Pip Instal Django-Crispy-Forms

Setelah ini diinstal, tambahkan ke settings.py
from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
Installed_apps = [ # ... kode sebelumnya di sini 'Crispy_Forms', ]

… Kode sebelumnya di sini

Sekarang, kembali ke template umpan kami, kami dapat menghapus beberapa hal. Mari kita hapus awal dan akhir dokumen dan ganti dengan warisan dari templat dasar kita, menggunakan Extends dan definisi blok. Juga, kami akan menambahkan impor filter templat dengan beban dan filter templat ke formulir. Terakhir, mari kita tambahkan kelas bootstrap ke tombol pada formulir agar terlihat lebih seperti tombol. Itu seharusnya terlihat seperti ini:
python manage.py check
{ % meluas 'base.html' %} { % Block Body %} { % Load crispy_forms_tags %} { % csrf_token %} {{Form | Crispy}} Posting baru { % untuk posting di posting %} {{Post.Text}} { % endfor %} { % endblock %}

Cantik! Itu sudah sedikit kode. Selanjutnya, kita harus mengujinya dan memastikan kita dapat melihat bahwa semuanya terlihat bagus, dan juga pastikan semuanya berfungsi dengan baik. Jalankan server sesuai instruksi sebelumnya dan pastikan situsnya terlihat dan berfungsi dengan baik. Kerja bagus! Anda siap untuk melanjutkan ke langkah berikutnya, di mana kami akan menambahkan fungsi login pengguna menggunakan URL, formulir, tampilan, dan templat yang serupa. Template dasar penting, dan kami akan terus memodifikasinya dan membuat perubahan sesuai kebutuhan, tetapi untuk saat ini mari kita fokus membuat situs kami lebih aman, dengan memungkinkan pengguna untuk masuk dengan nama pengguna dan kode sandi, dan pada akhirnya bahkan lebih banyak informasi penting yang akan membantu menjaga aplikasi Anda tetap aman dan akun Anda sendiri hanya dapat diakses oleh Anda.

Untuk melakukan ini, kita perlu menggunakan model pengguna yang dibangun ke dalam Django. Model pengguna adalah model database, seperti posting kami, yang dapat diterjemahkan untuk mencatat pengguna ke situs web. Di masa depan, sebelum kami menggunakan situs ke internet, kami akan memperluas model ini dengan model lain yang dikaitkan dengannya, dan membangun langkah -langkah keamanan tambahan untuk login yang resisten terhadap phishing. Kami akan mulai dengan menggunakan beberapa formulir login bawaan yang disediakan Django. Pertama, mari kita buat aplikasi baru yang akan kita gunakan untuk membuat templat dan tampilan untuk halaman login dasar. Kami juga akan membuat aplikasi lain untuk mewakili tantangan login yang berkelanjutan untuk mengamankan aplikasi, termasuk pincode, pengenalan wajah, komunikasi dekat lapangan, perangkat eksternal, otentikasi multi -faktor, dan pengenalan sidik jari.
python manage.py runserver 0.0.0.0:8000
Kami sudah berbicara tentang memulai aplikasi. Dari direktori kami, di dalam lingkungan virtual, lulus kelola.py argumen ini

Python Manager.py Mulai Mulai Pengguna

Sekarang, kita harus memiliki direktori untuk aplikasi baru. Mari kita mulai dengan membuat tampilan di direktori yang sesuai dengan login pengguna. Django telah membangun tampilan untuk login pengguna, tetapi ini tidak akan cocok untuk kita karena kita membutuhkan tampilan khusus, yang lebih disukai dilakukan dengan definisi.

Dalam tampilan ini, kami akan mulai dengan memeriksa permintaan POST, lulus permintaan.

Di pengguna/views.py, tambahkan kode berikut
from django.db import models # dari django.shortcuts impor render, redirect
dari django.urls impor terbalik
dari django.contrib.auth.forms Import AuthenticationForm, SetPasswordForm
dari django.contrib.auth impor otentikasi, logout
dari django.contrib.auth Impor login sebagai auth_login
dari Django.contrib Impor pesan

Def Login (permintaan):
    Jika request.method == "post":
        UserName = request.post ['username'] # Dapatkan nama pengguna dan kata sandi dari permintaan posting
        kata sandi = request.post ['password'] # mengotentikasi pengguna
        user = otentikasi (nama pengguna = nama pengguna, kata sandi = kata sandi)
        Jika pengguna:
            auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend')
            pesan.success (permintaan, 'kata sandi Anda diterima. Silakan lanjutkan')
            Return Redirect (Reverse ('Feed: Feed'))
        Lain: Pesan. Warning (permintaan, 'nama pengguna atau kata sandi yang salah. Silakan coba lagi')
    return render (request, 'user/login.html', {'form': authenticationForm ()})
class Post(models.Model): # Dapatkan nama pengguna dan kata sandi dari permintaan posting
    id = models.AutoField(primary_key=True) # Mengotentikasi pengguna
    text = models.TextField(default='') # Ini semua yang Anda butuhkan untuk tampilan login dasar. Sekarang, mari kita buat formulir untuk tampilan dengan memperluas template dasar. Kami akan mulai dengan membuat direktori baru untuk templat di folder pengguna.
Pengguna/Templat MKDIR Pengguna/Templat/Pengguna MKDIR

Sekarang, kita harus dapat mengedit pengguna/templat/pengguna/login.html. Sementara kami melakukannya, kami akan membuat templat untuk memungkinkan pengguna juga mendaftar.

Pengguna Nano/Templat/Pengguna/Login.html

Sekarang, di template,

{ % meluas 'base.html' %} { % Load crispy_forms_tags %} { % blok konten %} { % csrf_token %} Masuk {{Form | Crispy}} Login { % endblock %}

Ini adalah dasar -dasar templat login. Ini benar -benar seperti templat lain dalam struktur, tetapi terlihat sedikit berbeda ketika diterjemahkan. Kami dapat menyalin kode ini untuk membangun templat lain yang sangat mirip yang disebut register.html, di mana kami akan mengubah kata -kata dan menggunakan formulir baru yang kami bangun. Mari kita buat template dulu. Edit pengguna/templat/pengguna/register.html dan tambahkan kode berikut:

{ % meluas 'base.html' %} { % Load crispy_forms_tags %} { % blok konten %} { % csrf_token %} Buat akun {{Form | Crispy}} Daftar { % endblock %}

Sekarang, mari kita bangun formulir untuk pendaftaran pengguna kami dan lingkari kembali ke tampilan sebelum kami meningkatkan login pengguna kami dengan model. Kami akan membuat formulir ini dasar untuk memulai, tetapi menggabungkan lebih banyak detail dan fitur keamanan seperti perjanjian dan captcha di masa depan. Edit formulir dengan pengguna nano/forms.py, dan tambahkan kode berikut.

Dari formulir impor Django dari django.contrib.auth.models impor pengguna dari django.contrib.auth.forms impor usercreationform Kelas UserRegisterForm (UserCreationForm): email = forms.emailfield () Meta kelas: model = pengguna Fields = ['nama pengguna', 'email', 'password1', 'password2']
from django import forms
from feed.models import Post

class PostForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Post
        fields = ('text',)
Jadi kami memiliki formulir lain di sini, yang berfungsi cukup sederhana. Ini adalah formulir daftar pengguna dengan nama pengguna, email dan kata sandi, serta bidang kata sandi konfirmasi. Perhatikan bahwa formulir ini tidak memperpanjang formulir reguler. Kelas bentuk, ini adalah bentuk model yang berarti memiliki meta. Satu bidang didefinisikan sama, dan meta kelas mendefinisikan model formulir sesuai dengan sisa informasi yang akan ditulis ke formulir. Sebagian besar sudah ada di Django yang dibangun di UserCreationForm, jadi kami akan menggunakannya sebagai dasar untuk kelas (diteruskan dalam tanda kurung).

Selanjutnya, kami akan memeriksa tampilan untuk mendaftarkan pengguna, sekarang kami memiliki formulir dan templat. Ini adalah modelform, seperti yang ada di tampilan posting baru. Edit pengguna/views.py dan tambahkan kode berikut:

# ... impor dari .forms impor userregisterform Def Register (permintaan): Jika request.method == "post": Form = UserRegisterForm (request.post) jika form.is_valid (): user = form.save () pesan.success (permintaan, 'Selamat datang di aplikasi, {}.'. Format (user.username)) return render (request, 'user/register.html', {'form': userRegisterForm})
python manage.py makemigrations
python manage.py migrate
… Impor

Hanya ini yang kita butuhkan untuk mendapatkan pengguna yang terdaftar, tetapi kita harus memiliki lebih banyak informasi. Kami ingin mengetahui waktu yang didaftarkan pengguna, jam berapa mereka terakhir di Situs, beberapa informasi tentang mereka, seperti biografi, zona waktu, dll. Kami juga perlu memperbarui model umpan kami, memposting, untuk memperhitungkan model pengguna dan atribut posting untuk setiap pengguna. Untuk melakukan itu, kami akan memperbarui model.py di kedua aplikasi. Mari kita mulai dengan mengedit model umpan. Ini seharusnya terlihat seperti ini sekarang:

Dari Django.db Model Impor #… Impor dari django.contrib.auth.models impor pengguna Posting kelas (model.model): id = model.autofield (primer_key = true) penulis = model.foreignKey (pengguna, on_delete = model.cascade, null = true, blank = true, terkait_name = 'post') # Tambahkan di baris ini text = model.textField (default = '')
    posts = Post.objects.all() # … Impor
Tambahkan baris ini

Perhatikan baris kedua yang ditambahkan ke file. Ini adalah kunci asing, yang akan mengaitkan setiap posting dengan satu pengguna per posting, sehingga kami dapat memastikan bahwa kami menyimpan posting berdasarkan pengguna per pengguna dan tidak ada posting yang dapat dilakukan tanpa menghubungkannya dengan pengguna. Kami mendefinisikan kunci asing ini dengan kelas yang diwakilinya, argumen penghapusan untuk memastikan posting dihapus dengan pengguna, nol dan argumen kosong untuk memastikan kami dapat menghapus pengguna jika perlu, dan untuk mengakomodasi kurangnya pengguna pada posting yang sudah kami buat, dan nama terkait, yang dapat kami gunakan untuk merujuk ke objek pos yang dibuat pengguna. Nama terkait ini, tidak seperti Post.Author, penulis posting, memberi kami pengguna yang memposting posting itu sendiri. Kami sekarang dapat mendapatkan posting yang dibuat pengguna dengan menjalankan user.posts.all (), atau worit.posts.all ().

Sekarang, mari kita buat login kita lebih tangguh. Kami sudah dapat membuat situs kami jauh lebih rentan terhadap phishing hanya dengan membatasi berapa kali kami akan mengizinkan login ke situs, ini cukup mudah. Mari kita juga mulai menyimpan beberapa informasi tentang setiap pengguna sebelumnya karena kami terus mengembangkan aplikasi kami. Mengedit pengguna/model.py, tambahkan kode berikut.

dari model impor django.db dari django.contrib.auth.models impor pengguna dari django.utils impor zona waktu Profil kelas (model.model): user = model.oneToonEfield (user, on_delete = model.cascade, null = true, blank = true, terkait_name = 'profile') Account_created = Model.DateTimefield (default = timezone.now) last_seen = model.dateTimefield (default = timezone.now) can_login = model.dateTimefield (default = timezone.now) preferred_name = model.charfield (max_length = 20, default = '', null = true, blank = true) bio = model.textField (blank = true, default = '')

Perhatikan bahwa model ini cukup mirip dengan model POST. Kami memiliki impor tambahan, TimeZone, yang akan memungkinkan kami untuk menetapkan default di bidang DateTime, dan kami juga memiliki karakterfeild dan textfield seperti posting. Menggunakan semua cap waktu ini membantu kami mengamankan situs dan memahami penggunaannya, dan bidang teks memungkinkan kami memberikan informasi tentang setiap pengguna, atau penulis, di situs web. OneToonefield harus menjadi satu -satunya pertimbangan kecil, itu berperilaku persis sama dengan ke depan tetapi dengan hanya satu model selanjutnya. Dengan cara ini, pengguna hanya memiliki satu profil, sementara mereka mungkin memiliki banyak posting.
mkdir feed/templates
mkdir feed/templates/feed
Sekarang, mari kita tingkatkan login kami dan daftarkan tampilan untuk memperhitungkan profil. Pertama, edit pengguna/views.py dan fokuslah pada tampilan register:

# ... impor dari .forms impor userregisterform Def Register (permintaan): Jika request.method == "post": Form = UserRegisterForm (request.post) jika form.is_valid (): user = form.save () Profile.objects.create (user = user) # Pastikan untuk menambahkan baris ini, untuk membuat profil untuk pengguna pesan.success (permintaan, 'Selamat datang di aplikasi, {}.'. Format (user.username)) return render (request, 'user/register.html', {'form': userRegisterForm})

… Impor
Pastikan untuk menambahkan baris ini, untuk membuat profil untuk pengguna

Ini hanya membuat profil untuk pengguna, tanpa mengisi informasi apa pun. Sekarang, kami ingin memastikan akun pengguna tidak dapat terlalu sering masuk, atau setidaknya kata sandi tidak dapat dicoba terlalu sering, jadi mari kita perbarui tampilan login.

# ... impor Dari .Models Impor Profil dari django.utils impor zona waktu impor datetime Def Login (permintaan): Jika request.method == "post": username = request.post ['username'] kata sandi = request.post ['password'] user = otentikasi (nama pengguna = nama pengguna, kata sandi = kata sandi) Jika pengguna dan pengguna auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') pesan. Return Redirect (Reverse ('Feed: Feed')) lain: # Jika login tidak berhasil, Pesan. Warning (permintaan, 'Nama pengguna atau kata sandi yang salah. Silakan coba lagi.') user = user.objects.filter (username = username) .first () # Ini adalah bagian di mana kami memperbarui profil pengguna Jika pengguna: profil = user.profile profile.can_login = timezone.now () + datetime.timedelta (detik = 15) # Jadi mereka tidak dapat masuk lagi selama beberapa detik profile.save () return render (request, 'user/login.html', {'form': authenticationForm ()})
python manage.py shell
… Impor

Perhatikan bahwa kami sekarang memeriksa apakah pengguna dapat masuk

Jika login tidak berhasil,
from feed.models import Post
Ini adalah bagian di mana kami memperbarui profil pengguna

Jadi mereka tidak bisa masuk lagi selama beberapa detik

Ini adalah dasar dasar keamanan. Pastikan situs tidak rentan terhadap seseorang yang hanya mencoba setiap kombinasi kata sandi yang mungkin, atau bahkan beberapa di antaranya pada saat yang sama. Ini tidak akan membuat frustrasi bagi pengguna biasa yang mengetahui kode sandi mereka dan hanya masuk pada beberapa perangkat, tetapi itu akan membuat banyak robot phishing keluar dari aplikasi. Perhatikan bahwa kami menambahkan pernyataan IF dengan variabel, can_login, yang seharusnya menjadi waktu di masa lalu, dan memperbarui dengan masing -masing login yang gagal menggunakan nama pengguna yang sama. Dengan cara ini, pengguna jahat tidak akan bisa menebak kata sandi di mana pun dengan cepat. Jumlah detik dalam datetime.timedelta () juga dapat diperbarui, dan situs web akan lebih tangguh namun sedikit kurang dapat digunakan dengan lebih banyak detik. Saya merekomendasikan 15 untuk memulai.
Post.objects.create(text='hello world')
exit()
Ingat, kami membangun skrip cadangan untuk menyimpan pekerjaan kami, jadi mari kita lanjutkan dan mendukung apa yang kami miliki sejauh ini untuk memastikan kami memiliki segalanya yang disimpan. Jalankan perintah:

cadangan sudo

Sekali lagi, ini akan menyimpan pekerjaan Anda sejauh ini. Saya sarankan menjalankan cadangan yang sering untuk menyimpan pekerjaan Anda, dan Anda bahkan mungkin ingin menjalankan pekerjaan cadangan secara otomatis. Anda dapat melakukan ini dengan menggunakan utilitas UNIX yang disebut Cron. Untuk mengaktifkan utilitas ini, jalankan perintah berikut dan masukkan kata sandi Anda:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
sudo crontab -e

Jika Anda belum memilih Opsi 1 untuk Nano, editor teks yang harus Anda kenal, dan gulir ke bagian bawah file menggunakan tombol panah. Tambahkan baris berikut:

0 * * * * cadangan sudo
from django.urls import include # Cron menggunakan format menit, jam, hari bulan, bulan, hari dalam seminggu, di mana A * atau angka mewakili kapan harus menjalankan perintah. Menggunakan 0 untuk menit dan * untuk sisa opsi, kami dapat menjalankan perintah pada menit pertama setiap jam di awal menit. Ini memungkinkan kami mendukung kode secara otomatis. Semua pekerjaan Cron ketika dieksekusi dengan sudo berjalan sebagai root, jadi kita tidak perlu mengetikkan kata sandi setiap jam.
    # Untuk membuatnya lebih mudah untuk mencadangkan kode kami tanpa menggunakan kata sandi, mari kita nonaktifkan kata sandi untuk perintah cadangan kami. Kami akan melakukan ini dengan menjalankan perintah berikut dan memasukkan kata sandi:
Sudo Visudo

Sekarang, mari gulir ke bagian bawah file dan tambahkan baris lain:

Semua = nopasswd: /bin /cadangan
backup
Ini memungkinkan kami menjalankan perintah "cadangan" sebagai pengguna mana pun, tanpa kata sandi. Format untuk ini mudah, cukup awalkan garis dengan "all all = nopasswd:/bin/" dan akhiri dengan perintah, misalnya/bin/cadangan, yang ada di/usr/bin/.

Sekarang, mari kita mulai bekerja dengan email. Email sangat penting untuk situs web, karena ini cara untuk menjaga situs web lebih aman, memverifikasi pengguna adalah orang sungguhan, dan bahkan memasarkan produk atau layanan kepada pelanggan. Banyak orang yang sering mengunjungi internet memeriksa email mereka setiap hari, dan menerima segala macam email pemasaran tentang produk dan layanan yang mereka minati. Ada beberapa opsi dalam hal memungkinkan email di situs web Django, dan Anda dipersilakan untuk memilih mana yang paling cocok untuk Anda.

Pertama, Anda dapat membayar layanan email yang akan memungkinkan Anda untuk mengirim email dari domain Anda dan membutuhkan kode minimal. Ada banyak layanan yang menawarkan ini, seperti Google Workspace, SendinBlue, Mailgun, dan banyak lagi.
    posts = Post.objects.all() # Jika tidak, Anda tidak akan membangun layanan email Anda sendiri di dalam server Anda dari awal. Saya merekomendasikan opsi ini, meskipun lebih banyak kode dan mungkin memerlukan hosting khusus. Anda tidak akan dapat memulai server surat dari komputer rumah Anda kemungkinan besar, jadi mari kita lanjutkan dan periksa konfigurasi dan kode untuk mengirim email sebelum kami memulai server di cloud dan membuat server surat kami sendiri di dalam.
    if request.method == 'POST': # Pertama, edit settings.py dengan perintah berikut:
        form = PostForm(request.POST) # nano app/settings.py
        if form.is_valid(): # Di mana aplikasi adalah nama aplikasi yang Anda buat dengan StartApp.
            form.save() # Tambahkan baris berikut:
        return redirect(reverse('feed:feed')) # Site_name = 'Aplikasi Django'

Email_backend = 'django.core.mail.backends.smtp.emailbackend'
Email_host = 'localhost'
Email_port = 587
Email_use_tls = true
Email_address = username@server.com '
Email_host_user = 'nama pengguna'
Email_host_password = config ['email_host_password']
Default_from_email = '{} <{}>'. Format (situs_name, email_host_user)
        'form': PostForm(), # Pastikan untuk mengubah ini saat Anda siap untuk menggunakan aplikasi Anda, kami akan meninjau kembali ini nanti. Pengaturan email_address harus berupa email yang ingin Anda kirim, dan kata sandi (email_host_password) harus disetel ke kata sandi yang Anda hasilkan untuk server. Saya memuat kata sandi dari file konfigurasi untuk menjauhkannya dari kode menggunakan logika berikut, di atas baris ini di settings.py:
Impor OS Impor JSON dengan terbuka ('/etc/config.json') sebagai config_file: config = json.load (config_file)

Kemudian, saya telah mengatur file JSON dengan konfigurasi di /etc/config.json menggunakan nano sebagai berikut.

Untuk mengedit file:

sudo nano /etc/config.json
Tambahkan baris berikut:

{ "Email_host_password": "" }

Kami akan terus mengedit file konfigurasi dan menambahkan semua kata sandi dan kunci yang akan kami gunakan di aplikasi. Untuk saat ini, mari kita periksa cara mengirim email dengan cepat menggunakan Python. Pertama, mari kita buat templat untuk email verifikasi yang dapat kami kirim ke pengguna kami, dan letakkan di direktori Template Pengguna. Template ini akan ditulis dalam HTML.

Pengguna Nano/Templat/Pengguna/Verifikasi_email.html

Aplikasi Django - Verifikasi Email Anda Dear {{user.username}}, Untuk memverifikasi email Anda, silakan klik di sini. Atau, Anda dapat menempelkan tautan berikut di bilah alamat browser Anda: {{base_url}} { % url 'pengguna: aktifkan' uidb64 = uid token = token %} Tautan akan kedaluwarsa dalam 30 menit. Jika Anda belum meminta email verifikasi, Anda dapat mengabaikan email ini. Sampai jumpa di sana, Daisy

Email ini cukup sederhana. Dibutuhkan konteks pengguna, URL dasar untuk situs, dan ID pengguna dan token yang digunakan untuk memverifikasi email pengguna. Pastikan untuk mendefinisikan URL dasar di settings.py sebelum kita menulis beberapa kode Python untuk membuat template. Silakan dan tambahkan baris berikut ke app/settings.py, dekat awal.Site_name = 'Aplikasi Django' Protokol = 'https' Domain = 'example.com' Base_url = protokol + ': //' + domainAkhirnya, ketika situs Anda siap untuk internet dan Anda menggunakannya, Anda ingin mendefinisikan domain Anda sebagai nama domain yang Anda beli untuk mewakili situs. Ini adalah nama yang akan Anda ketik di navbar untuk mengakses situs Anda. Untuk saat ini, Anda dapat membiarkan domain kosong atau menggunakan placeholder. Anda juga ingin mengubah situs_name menjadi nama yang ingin Anda berikan kepada situs Anda, pilihan Anda.

Sebelum kami mengirim email, mari kita buat generator token sehingga kami dapat memiliki token aktivasi akun yang tidak pernah kedaluwarsa. Kita dapat melakukan ini dengan membangun dan mengimpor token aktivasi akun yang terlihat seperti berikut. Edit file:

Pengguna Nano/Tokens.py

Tambahkan kode berikut:

dari django.contrib.auth.tokens impor kata sandi Impor enam Kelas Tokengenerator (Passwordresettokengenerator): def _make_hash_value (self, user, timestamp): kembali ( Six.Text_Type (user.pk) + Six.Text_Type (timestamp) ) account_activation_token = tokengenerator () unsubscribe_token = tokengenerator ()

Generator token dasar ini menghasilkan token yang dapat kami kirimkan kepada pengguna dalam URL dan pengguna dapat menggunakan untuk memverifikasi email mereka dan mengaktifkan akun mereka.
Selanjutnya, mari kita lihat cara mengirim email. Menggunakan Nano, edit pengguna/email.py.

Pengguna Nano/Email.py

Mengirim email verifikasi html akan terlihat seperti ini:

dari django.contrib.auth impor get_user_model dari django.utils.http impor urlsafe_base64_encode, urlsafe_base64_decode dari django.contrib.sites.shortcuts impor get_current_site dari django.core.mail impor send_mail dari django.template.loader impor render_to_string dari django.utils.encoding impor force_bytes dari django.core.mail impor emailmultialternatives dari django.shortcuts impor render dari .tokens impor account_activation_token dari django.template.loader impor render_to_string dari django.utils.html impor strip_tags Dari Templat Impor Django.Template, Konteks dari pengaturan impor django.conf Impor Traceback def send_verification_email (pengguna): User = get_user_model () mail_subject = '[{}] Aktifkan akun Anda.'. Format (settings.site_name) html_message = render_to_string ('user/verification_email.html', { 'pengguna': pengguna, 'domain': settings.domain, 'Protokol': 'https', 'uid': urlsafe_base64_encode (force_bytes (user.pk)), 'token': account_activation_token.make_token (pengguna), }) send_html_email (user, mail_subject, html_message)

Ini cukup sederhana. Kami mengimpor fungsi yang kami butuhkan untuk mengirim email, membuat email dengan templat, dan pengaturan kami, dan kemudian kami menentukan email dengan nama templat dan mengirimkannya ke pengguna menggunakan fungsi. Anda akan melihat kami belum menentukan fungsi untuk mengirim surat, send_html_email, jadi, jadi mari kita tulis ini di bawah kode yang sudah kami tambahkan ke pengguna/email.py
pip install django-crispy-forms
def send_html_email (user, mail_subject, html_message): to_email = user.email username = user.username Jika to_email == '': tidak ada yang kembali unsub_link = settings.base_url + user.profile.create_unsubscribe_link () html_message = html_message + "berhenti berlangganan" msg = emailMullialternatives (mail_subject, strip_tags (html_message), settings.default_from_email, [to_email], header = {'daftar-tidak ada': '<' + unsub_link + '>'}) msg.attach_alternative (html_message, "teks/html") profil = user.profile mencoba: msg.send (fail_silently = false) Jika bukan profil.email_valid: profile.email_valid = true profile.save () kecuali: profile.email_valid = false profile.save ()

Ini sedikit lebih kompleks, dan kami belum siap menjalankan semua kode ini. Perhatikan kami mendefinisikan unsub_link, tautan yang dapat digunakan pengguna untuk berhenti berlangganan dari email kami. Ini penting, karena pengguna harus dapat memilih keluar dari email kami kecuali mereka ingin melihatnya, kapan saja. Kami juga menambahkan alternatif teks ke pesan kami, yang merupakan pesan HTML yang dilucuti dari tag HTML. Terakhir, kami memeriksa apakah email dikirim, dan jika tidak, kami menandai di profil pengguna bahwa email mereka tidak valid.

Mari kita kembali ke model pengguna sehingga kita dapat membuat ini semua berfungsi. Kita perlu mendefinisikan fungsi untuk menghasilkan tautan untuk berhenti berlangganan, dan mendefinisikan bidang Boolean untuk menandai bahwa email pengguna tidak valid.
    # Pertama, tambahkan impor berikut ke bagian atas pengguna/model.py
pengguna nano/model.py

# ... dari django.core. dari django.urls impor terbalik

...
Selanjutnya, mari kita tambahkan fungsi ke model pengguna untuk membuat token dan periksa token yang digunakan untuk mengaktifkan email, serta bidang untuk menyimpan apakah pengguna berhasil menerima surat mereka. Di pengguna/model.py lagi, tambahkan kode berikut ke akhir model (kode indentasi)

# ... email_valid = model.booleanfield (default = true) def make_token (self): return timestampsigner (). tanda (self.user.username) def check_token (self, token): mencoba: key = '%s:%s'%(self.user.username, token) TimestampSigner (). Unsign (kunci, max_age = 60 * 60 * 24 * 30) # valid selama 30 hari Kecuali (BadSignature, SignatureExpired): mengembalikan false kembali benar def create_unsubscribe_link (self): nama pengguna, token = self.make_token (). split (":", 1) return reverse ('pengguna: berhenti berlangganan', kwargs = {'username': nama pengguna, 'token': token,})

...

Berlaku selama 30 hari

Ini cukup sederhana, kami menggunakan timestampSigner, yang merupakan alat kriptografi dasar, untuk membuat token yang akan kedaluwarsa setelah waktu tertentu, dan kami juga menggunakan fungsi lain untuk memeriksa apakah itu valid. Kami menggunakan token ini dua kali, sekali untuk memverifikasi email, dan sekali untuk tautan berhenti berlangganan.

Sekarang kita memiliki ini, pekerjaan terakhir yang perlu kita lakukan adalah dalam pandangan. Di dalam pengguna/views.py, mari tambahkan tampilan untuk memverifikasi alamat email, dan untuk berhenti berlangganan.

Pengguna Nano/views.py
python manage.py startapp users
Pertama, tambahkan impor berikut. Saya melemparkan beberapa tambahan sehingga kami tidak perlu mengimpor lebih banyak item lagi nanti.

dari Django.contrib.Auth Impor Logout dari django.shortcuts impor render, redirect, get_object_or_404 dari django.contrib.auth.models impor pengguna dari django.utils.encoding impor force_str dari django.utils.http impor urlsafe_base64_encode, urlsafe_base64_decode Impor JSON permintaan impor Impor Datetime, Traceback dari Django.contrib Impor pesan Dari .Models Impor Profil dari django.utils impor zona waktu dari django.views.decorators.cache impor never_cache dari .Mail impor send_verification_email # pastikan untuk mengimpor fungsi pengiriman email verifikasi dari django.contrib.auth.decorators impor login_required dari django.contrib.auth.mixins impor loginrequiredMixin, userpassestMixin dari django.utils.decorators impor method_decorator dari django.http impor httpresponseredirect dari pengaturan impor django.conf dari django.utils impor zona waktu impor datetime impor pytz dari django.views.decorators.csrf impor csrf_exempt dari django.http impor httpresponse dari django.contrib.auth.tokens impor default_token_generator dari django.utils.http impor urlsafe_base64_decode dari .tokens impor account_activation_token

Pastikan untuk mengimpor fungsi pengiriman email verifikasi

Anda mungkin sudah memiliki beberapa impor ini, tetapi tidak ada salahnya untuk mengulanginya. Anda perlu mengimpor fungsi pengiriman email verifikasi, serta account_activation_token dari pengguna. Tokens, di antara impor lainnya.

Sekarang, di bagian bawah file, tambahkan kode berikut:

Def berhenti berlangganan (permintaan, nama pengguna, token): user = get_object_or_404 (pengguna, nama pengguna = nama pengguna) if ((request.user.is_authenticated and request.user == user) atau user.profile.check_token (token)): # berhenti berlangganan mereka profil = user.profile profile.subscribed = false profile.save () Return render (permintaan, 'pengguna/berhenti berlangganan.html') # Jika tidak, redirect ke halaman login Pesan. Warning (permintaan, tautan berhenti berlangganan Anda telah kedaluwarsa. Silakan masuk ke Unsubscribe. ') next_url = reverse ('pengguna: berhenti berlangganan', kwargs = {'username': nama pengguna, 'token': token,}) return httpresponseredirect ('%s? next =%s'%(reverse ('login'), next_url))) Def Activate (Request, UIDB64, Token): mencoba: uid = force_str (urlsafe_base64_decode (uidb64))) user = user.objects.get (pk = uid) Kecuali (TypeError, ValueError, Overflowerror, User.DoesNotExist): pengguna = tidak ada ip = get_client_ip (permintaan) Jika Pengguna tidak ada dan Account_Activation_Token.Check_Token (pengguna, token): user.profile.email_verified = true user.profile.save () user.save () # sendwelcomeemail (permintaan, pengguna) pesan.success (permintaan, f'thanks untuk mengonfirmasi email Anda! Anda sekarang dapat masuk ke akun Anda, dan email selamat datang telah dikirimkan kepada Anda. ') return redirect (user.profile.create_face_url ()) kalau tidak: Pesan. return redirect ('verifikasi: verifikasi') def resend_activation (permintaan): Jika request.method == 'pos': form = resendActivationeMailForm (request.post) email = request.post ['email'] mencoba: user = user.objects.get (email = email) send_verification_email (pengguna) Pesan. return redirect (reverse ('verifikasi: verifikasi')) kecuali: Pesan. Warning (permintaan, email Anda tidak benar. Silakan coba lagi. ') kalau tidak: form = resendActivationeMailform () return render (permintaan, 'pengguna/resend_activation.html', {'form': form, 'title': 'Resend Activation', 'Small': True})

berhenti berlangganan mereka
        username = request.POST['username'] # Jika tidak, redirect ke halaman login
        password = request.POST['password'] # sendwelcomeemail (permintaan, pengguna)
Ini banyak kode. Mari kita hancurkan. Fungsi pertama, bersih dan sederhana, berhenti berlangganan pengguna dari milis. Fungsi kedua mengaktifkan email mereka, dan Anda akan melihat saya menambahkan fungsi yang dikomentari, SendWelcomeemail. Anda dipersilakan untuk menggunakan templat email dan definisi fungsi untuk mengirim email selamat datang, saya belum melakukannya. Fungsi terakhir yang saya lemparkan adalah penting, karena email aktivasi kedaluwarsa. Oleh karena itu, kita perlu mengirimkan kembali email aktivasi beberapa waktu. Kami dapat menggunakan formulir dasar untuk ini, dan memanggil fungsi untuk mengirim email verifikasi. Sebelum kita melakukan ini, mari kita pastikan itu akan dikirim ke tempat pertama, dengan menambahkan panggilan fungsi ke tampilan register. Tambahkan baris ini tepat sebelum pengalihan di tampilan register, DEF Register, di pengguna/views.py.

Pengguna Nano/views.py

# ... (Setelah) Def Register (permintaan): send_verification_email (pengguna) # ... (Sebelum) Redirect (
mkdir users/templates
mkdir users/templates/users
… (Setelah) Def Register (permintaan):

... (Sebelum) Redirect (

Anda tidak perlu menambahkan baris pertama dan terakhir dalam cuplikan kode itu, pastikan tampilan register mengirimkan email verifikasi ke pengguna. Seharusnya terlihat seperti ini:
nano users/templates/users/login.html
# ... impor dari .forms impor userregisterform Def Register (permintaan): Jika request.method == "post": Form = UserRegisterForm (request.post) jika form.is_valid (): user = form.save () send_verification_email (pengguna) # Pastikan untuk menambahkan baris ini! pesan.success (permintaan, 'Selamat datang di aplikasi, {}.'. Format (user.username)) return render (request, 'user/register.html', {'form': userRegisterForm})

… Impor

Pastikan untuk menambahkan baris ini!
Sekarang, kita perlu menambahkan formulir untuk mengirimkan kembali email aktivasi. Di pengguna/forms.py, tambahkan formulir berikut:

# ... (impor) kelas resendActivationeMailform (forms.Form): email = forms.emailfield (wajib = true)

… (Impor)
Kami juga membutuhkan templat yang sesuai dengan formulir aktivasi email ini. Mari kita tambahkan template ini. Edit file:

Pengguna Nano/Templat/Pengguna/Resend_Activation.html

Selanjutnya, tambahkan kode berikut ke file.
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
{ % meluas 'base.html' %} { % blok konten %} { % Load crispy_forms_tags %} { % csrf_token %} Kirim ulang email aktivasi {{Form | Crispy}} Kirim ulang email aktivasi { % endblock %}

Wah, itu banyak! Sekarang, ketika kami menggunakan kode ke server kami, kami akan dapat mengirim email HTML dan mengaktifkan akun pengguna dengan klik di email. Kami juga mungkin ingin mengirim email selamat datang sederhana, jadi mari kita lihat bagaimana melakukannya. Kembali ke pengguna/email.py, tambahkan kode berikut:

def sendwelcomeemail (pengguna): User = get_user_model () html = buka ('{}/user/welcome_email.html'.format (settings.base_dir)). baca () subjek = 'Selamat datang di' + pengaturan.site_name + ', {{username}}!' template = template (html) subjtemplate = template (subjek) Context = Context ({'username': user.username, 'base_url': settings.base_url, 'model_name': 'Daisy Holton,' Site_name ': settings.site_name}) renderedTemplate = template.render (konteks) SubjContext = Context ({'UserName': user.username}) SubjrenderedTemplate = Subjtemplate.render (SubjContext) send_html_email (pengguna, subjrenderedtemplate, renderedtemplate)

Juga, kami akan membutuhkan templat untuk membuat semua informasi ini. Di situs web saya, template terlihat seperti di bawah ini, tetapi Anda dipersilakan untuk memformatnya sesuka Anda.

Selamat datang di {{site_name}} Halo {{username}}, Kami senang melihat Anda di sini! Terima kasih telah bergabung {{Site_name}} dan menjadi bagian dari kesenangan. Untuk memulai, berikut adalah beberapa hal yang dapat Anda lakukan setelah Anda memverifikasi identitas Anda. Gunakan aplikasi. Ini adalah halaman utama {{site_name}} Kunjungi profil private {{site_name}} saya. Ini adalah halaman bagi siapa pun yang ingin mengenal saya. Lebih banyak profil. Anda dapat menemukan orang -orang ini di situs, dan melihat konten mereka. Lihat semua posting di sini. Ini adalah halaman depan pribadi {{site_name}}. Bahkan ada lebih banyak di situs ini, jadi silakan mengunjungi dan melihat apa yang Anda temukan. Anda dapat berbagi situs dengan salah satu tombol sosial di setiap halaman. Saya harap Anda menikmati waktu Anda dengan {{site_name}}! Terima kasih sudah ada di sini. Dengan banyak cinta, {{model_name}} {{base_url}}
# Perhatikan bahwa kami tidak memiliki tag bodi atau html, karena kami menambahkannya saat kami menambahkan tautan berhenti berlangganan HTML. Ini penting, tetapi kami tidak ingin mendefinisikannya dua kali.
Terus gimana? Kami telah menempuh perjalanan panjang. Sungguh, kita harus siap untuk menggunakan situs ke server. Kami dapat menambahkan dekorator @login_required dan membuat pandangan kami aman, mengambil pendaftaran pengguna, mengirim email yang sesuai, dan informasi cache, yang merupakan dasar dari apa yang perlu dilakukan situs web agar tetap relevan. Kami akan menambahkan beberapa fitur yang lebih berguna, dan kemudian membangun dasar untuk menggunakan kode kami ke server jarak jauh, menyiapkan server surat, konfigurasi domain, dan filter untuk membuat situs kami aman dan sesuai.

Kami juga membutuhkan tampilan reset kata sandi, jadi mari kita tambahkan dengan sangat cepat. Tampilan reset kata sandi bawaan Django rusak dalam beberapa fungsi, tetapi kita akan melihat cara menulis tampilan kita sendiri, templat email, formulir, dan pola URL. Begitulah tampilannya, di pengguna/views.py

#... impor dari django.contrib.auth.tokens impor default_token_generator dari django.contrib.auth.forms impor setPasswordform dari django.utils.http impor urlsafe_base64_decode def password_reset (permintaan, uidb64, token): user = get_object_or_404 (user, id = urlsafe_base64_decode (uidb64))) Jika request.method == 'pos': Formulir = SetPasswordForm (pengguna, request.post) Jika form.is_valid () dan default_token_generator.check_token (pengguna, token): Form.Save () pesan.success (permintaan, 'Kata sandi Anda telah diatur ulang.') Elif not form.is_valid (): Pesan. Peringatan (permintaan, 'Kata sandi Anda tidak cocok, atau tidak memenuhi persyaratan. Silakan coba lagi.') return redirect (request.path) kalau tidak: Pesan. Warning (permintaan, 'Tautan Reset Kata Sandi Anda telah kedaluwarsa. Harap buat yang baru.') return redirect (reverse ('pengguna: login')) return render (request, 'user/password_reset_confirm.html', { 'Judul': 'Atur Ulang Kata Sandi', 'Form': SetPasswordForm (pengguna)
from django.db import models # ... impor
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Formulir ini dibangun untuk Django, tetapi kami akan memerlukan templat untuk mengonfirmasi reset kata sandi, pengguna/templat/pengguna/kata sandi_reset_confirm.html
{ % meluas 'base.html' %} { % Load crispy_forms_tags %} { % blok konten %} { % csrf_token %} Setel ulang kata sandi {{Form | Crispy}} Setel ulang kata sandi { % endblock konten %}

Kami juga memiliki template untuk mengirim email reset kata sandi, dengan formulir sederhana, di pengguna/templat/pengguna/kata sandi_reset.html

{ % meluas 'base.html' %} { % Load crispy_forms_tags %} { % blok konten %} { % csrf_token %} Setel ulang kata sandi {{Form | Crispy}} Meminta reset kata sandi { % endblock konten %}

Templat untuk email itu sendiri sederhana, itu adalah file dasar HTML yang membuat tautan untuk mengatur ulang kata sandi, di pengguna/templat/pengguna/kata sandi_reset_email.html. Django akan secara otomatis menafsirkan file ini.

Uglek - Setel ulang kata sandi Anda Halo, Untuk mengatur ulang kata sandi Anda, silakan klik di sini. Atau, Anda dapat menempelkan tautan berikut ke browser Anda: https://uglek.com { % url 'password_reset_confirm' uidb64 = uid token = token %} Jika Anda belum meminta pengaturan ulang kata sandi, Anda dapat mengabaikan email ini. Terima kasih telah bergabung dengan kami, Daisy
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')
Kami juga membutuhkan dua templat lagi. Yang pertama adalah mengkonfirmasi bahwa email telah dikirim. Pandangan untuk ini sudah ada di Django, jadi kita hanya perlu mengatasinya di urls.py. Templat ini terletak di pengguna/templat/pengguna/kata sandi_reset_done.html

{ % meluas 'base.html' %} { % blok konten %} Email telah dikirim dengan instruksi untuk mengatur ulang kata sandi Anda. { % endblock konten %}

Dan terakhir, untuk mengonfirmasi bahwa reset kata sandi selesai, pengguna/templat/pengguna/kata sandi_reset_complete.html

{ % meluas 'base.html' %} { % blok konten %} Kata sandi Anda telah ditetapkan. Masuk di sini { % endblock konten %}

Sekarang, kita membutuhkan pola URL untuk pandangan ini. Di pengguna/urls.py, tambahkan pola URL berikut:
# Urlpatterns = [
    #... URL sebelumnya di sini
    path ('password-reset/',
         auth_views.passwordresetview.as_view (
             template_name = 'user/password_reset.html',
             html_email_template_name = 'Users/password_reset_html_email.html'
         ),
         name = 'password_reset'),
    path ('kata sandi reset/selesai/',
         auth_views.passwordresetdoneView.as_view (
             template_name = 'user/password_reset_done.html'
         ),
         name = 'password_reset_done'),
    path ('kata sandi-reset-confirm ///',
         auth_views.passwordResetConfirmView.as_view (
             template_name = 'user/password_reset_confirm.html'
         ),
         name = 'password_reset_confirm'),
    path ('kata sandi-reset-lengkap/',
         auth_views.passwordResetCompleteView.as_view (
             template_name = 'user/password_reset_complete.html'
         ),
         name = 'password_reset_complete'),
]
            Profile.objects.create(user=user) # ... URL sebelumnya di sini
Empat template, itu banyak! Tapi sekarang kita dapat memastikan untuk dapat mengatur ulang kata sandi pengguna kapan saja kita perlu, semua dari browser web.

Saya mengerti ini banyak kode. Jika sepertinya sedikit di atas kepala Anda, tidak apa -apa. Anda akan meningkatkan, pemahaman Anda akan meningkat, dan Anda akan menjadi jauh lebih kompeten dengan kode segera. Jika Anda benar-benar tersesat, saya sarankan untuk kembali ke perangkat lunak ini nanti setelah mengerjakan kursus pembelajaran yang berjalan sendiri secara online. Ini biasanya bebas untuk memulai, dan akan memandu Anda melalui semua yang Anda butuhkan untuk sukses ketika Anda kembali ke proyek ini. Jika Anda merasa siap untuk melanjutkan, baca terus, selanjutnya, kami akan membahas penyebaran kode Anda ke server jarak jauh dan menyiapkan server surat, serta mengotomatisasi penyebaran Anda menggunakan bash sehingga Anda selalu dapat mengatur proyek baru dengan beberapa perintah sederhana.

Hal terakhir yang perlu kami lakukan sebelum digunakan ke server jarak jauh adalah membuat situs kami sedikit lebih aman. Anda akan melihat bahwa tampilan login hanya mengambil nama pengguna dan kata sandi, dan tidak ada otentikasi multi -faktor atau satu kode waktu. Ini adalah perbaikan yang mudah, dan dengan kode yang sama, kami dapat membuat situs kami mengirim pesan teks dan bahkan responsif terhadap pesan teks yang dikirim ke server. Untuk memulai, kami akan kembali ke model pengguna dan menambahkan penandatangan stempel waktu yang akan mewakili setiap login. Kami juga akan menambahkan pengidentifikasi yang unik dan berputar ke model pengguna yang akan digunakan untuk menambahkan keamanan ekstra ke login kami. Mengedit model pengguna, pengguna/model.py, tambahkan kode berikut:
# dari model impor django.db
dari django.contrib.auth.models impor pengguna
dari django.utils impor zona waktu
# Pastikan untuk mengimpor penandatangan UUID, timestamp dan generator URL (terbalik)
Impor UUID
dari django.core.
dari django.urls impor terbalik

Profil kelas (model.model):
    user = model.oneToonEfield (user, on_delete = model.cascade, null = true, blank = true, terkait_name = 'profile')
    Account_created = Model.DateTimefield (default = timezone.now)
    last_seen = model.dateTimefield (default = timezone.now)
    can_login = model.dateTimefield (default = timezone.now)
    preferred_name = model.charfield (max_length = 20, default = '', null = true, blank = true)
    bio = model.textField (blank = true, default = '')
    # Tambahkan kode ini di sini
    uid = model.charfield (max_length = 32, default = uuid.uuid4, null = true, blank = true)
    mfa_enabled = model.booleanfield (default = false)
    enable_mfa = model.booleanfield (default = false)
    phone_number = model.charfield (default = '', null = true, blank = true, max_length = 15)
    verifikasi_code = model.charfield (default = '', null = true, blank = true, max_length = 15)
    verifikasi_code_length = model.integerfield (default = 6)
    mfa_code_expires = model.dateTimefield (default = timezone.now)
    mfa_attempts = model.integerfield (default = 0)

    def make_auth_token (self):
        return timestampsigner (). tanda (self.uid)

    # Dan tambahkan fungsi ini
    def create_auth_url (self):
        nama pengguna, token = self.make_auth_token (). split (":", 1)
        return reverse ('pengguna: mfa', kwargs = {'username': nama pengguna, 'token': token,})

    def check_auth_token (self, token):
        mencoba:
            Key = '%s:%s'%(self.uid, token)
            TimestampSigner (). Unsign (key, max_age = 60 * settings.auth_valid_minutes) # valid selama 3 menit
        Kecuali (BadSignature, SignatureExpired):
            mengembalikan false
        kembali benar
        if user and user.profile.can_login < timezone.now(): # Pastikan untuk mengimpor penandatangan UUID, timestamp dan generator URL (terbalik)
        else: # Tambahkan kode ini di sini
            user = User.objects.filter(username=username).first() # Dan tambahkan fungsi ini
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Berlaku selama 3 menit
Pastikan pengguna/model.py Anda terlihat seperti ini, selain komentar (kode pada baris dengan #). Memecah ini, sederhana. Kami memiliki beberapa impor, penampungan timestams yang merupakan utilitas kriptografi yang dapat menghasilkan kode yang aman dan memverifikasi untuk memastikan itu valid, hanya digunakan sekali, dan tidak lebih tua dari jumlah detik tertentu. Kami juga menggunakan UUID, yang merupakan pengidentifikasi unik yang mengidentifikasi pengguna kami dalam penandatanganan token, dan di URL tempat token dikirim ke pengguna. Kami akan menggunakan kriptografi dasar ini untuk membangun tampilan otentikasi dua faktor. Sebelum kita melakukan hal lain, mari kita jalankan migrasi sehingga model pengguna kami diperbarui. Di direktori dengan kelola.py, jalankan perintah berikut untuk membuat dan menyelesaikan migrasi.

Sumber venv/bin/aktifkan python manager.py makemigrasi && python manager.py migrasi

Ini penting karena setiap kali kami melakukan perubahan pada model, kami perlu membuat tabel dan memperbarui database dengan default sebelum kami benar -benar dapat menggunakan model.

Selanjutnya, mari kita berimprovisasi tampilan login kita untuk mengarahkan kembali ke tampilan otentikasi sekunder. Di pengguna/views.py, hapus fungsi login dan redirect ke URL yang baru saja kami hasilkan dalam model pengguna.

# ... impor Def Login (permintaan): Jika request.method == "post": username = request.post ['username'] kata sandi = request.post ['password'] user = otentikasi (nama pengguna = nama pengguna, kata sandi = kata sandi) Jika pengguna dan pengguna # Hapus fungsi auth_login yang ada di sini pesan. Jika user.profile.mfa_enabled: return redirect (user.profile.create_auth_url ()) # Catatan Kami mengarahkan ke URL baru di sini lain: # Jika pengguna tidak menggunakan otentikasi mutli-factor, cukup login. auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') Return Redirect ('Feed: Feed') lain: # Jika login tidak berhasil, Pesan. Warning (permintaan, 'Nama pengguna atau kata sandi yang salah. Silakan coba lagi.') user = user.objects.filter (username = username) .first () # Ini adalah bagian di mana kami memperbarui profil pengguna Jika pengguna: profil = user.profile profile.can_login = timezone.now () + datetime.timedelta (detik = 15) # Jadi mereka tidak dapat masuk lagi selama beberapa detik profile.save () return render (request, 'user/login.html', {'form': authenticationForm ()})
sudo backup
… Impor

Perhatikan bahwa kami sekarang memeriksa apakah pengguna dapat masuk

Hapus fungsi auth_login yang ada di sini
sudo crontab -e
Catatan Kami mengarahkan ulang ke URL baru di sini

Jika pengguna tidak menggunakan otentikasi multi-faktor, cukup login.

Jika login tidak berhasil,
0 * * * * sudo backup
Ini adalah bagian di mana kami memperbarui profil pengguna

Jadi mereka tidak bisa masuk lagi selama beberapa detik

Jadi ini cukup sederhana, kami sekarang memiliki cara untuk mengarahkan kembali tampilan otentikasi dua faktor saat kami membuatnya. Kami juga memiliki fallback jika pengguna belum menambahkan nomor telepon. Kami akan menambahkan tampilan dasar untuk segera menambahkan nomor telepon dan segera masuk dengan pesan teks.

Pertama, kami membutuhkan cara mudah untuk mengirim pesan teks dari kode kami. Untuk melakukan ini, kita dapat memilih dari sejumlah API, tetapi yang termudah menurut saya adalah Twilio. Mereka juga menawarkan harga yang baik untuk proyek yang lebih kecil, serta diskon massal. Buat akun di twilio.com, isi beberapa detail tentang proyek Anda, beli nomor telepon, dan salin tombol API Anda ke settings.py Anda. Kemudian, tambahkan kode ini di bawah file baru, pengguna/sms.py.

Pengguna Nano/Sms.py
sudo visudo
# Impor semua paket yang diperlukan dari django.utils impor zona waktu impor acak impor datetime dari pengaturan impor django.conf dari feed.middleware impor get_current_request dari Django.contrib Impor pesan Impor Traceback Account_sid = settings.twilio_account_sid auth_token = settings.twilio_auth_token source_phone = settings.phone_number # Kode ini mengirimkan teks dengan twilio def send_text (target_phone, teks): dari Twilio.Rest Import Client mencoba: klien = klien (Account_sid, auth_token) Jika len (target_phone)> = 11: pesan = client.messages.create ( ke = target_phone, from_ = source_phone, tubuh = teks) kecuali: print (traceback.format_exc ()) # Fungsi pembantu untuk mendapatkan angka dengan begitu banyak digit def get_num_length (num, panjang): n = '' untuk x dalam kisaran (panjang): n = n + str (num) return int (n) # Kirim teks untuk memverifikasi pengguna def send_verification_text (pengguna): length = user.profile.verification_code_length kode = random.randint (get_num_length (1, panjang), get_num_length (9, panjang)); user.profile.verification_code = kode user.profile.mfa_code_expires = timezone.now () + datetime.timedelta (menit = 3) user.profile.save () send_user_text (pengguna, "kode verifikasi Anda untuk {} adalah {}". Format (settings.site_name, str (kode)))) # Kirim pengguna teks apa pun dengan fungsi ini def send_user_text (pengguna, teks): send_text (user.profile.phone_number, teks) # Validasi kode dengan fungsi ini def check_verification_code (pengguna, kode): user.profile.mfa_attempts += 1 result = user.profile.verification_code! = Tidak ada dan kode! = '' dan user.profile.verification_code == kode dan user.profile.mfa_code_expires> timezone.now () dan user.profile.mfa_attempts <= 3 Jika user.profile.mfa_attempts <3 dan hasilnya: user.profile.verification_code_length = 6 Elif user.profile.mfa_attempts> 2 dan bukan hasilnya: user.profile.verification_code_length = 8 user.profile.save () hasil pengembalian # Validasi waktu def check_verification_time (pengguna): hasil = user.profile.mfa_code_expires> timezone.now () hasil pengembalian

Impor semua paket yang diperlukan

Kode ini mengirimkan teks dengan twilio
ALL ALL=NOPASSWD: /bin/backup
Fungsi pembantu untuk mendapatkan angka dengan begitu banyak digit

Kirim teks untuk memverifikasi pengguna

Kirim pengguna apa pun dengan pengguna dengan fungsi ini

Validasi kode dengan fungsi ini

Validasi waktu

Pastikan untuk mengubah pengaturan Anda dengan tepat, menambahkan baris ini dengan kunci Anda:

# Pastikan untuk menyalin ini dari dasbor twilio Anda Twilio_account_sid = "" Twilio_auth_token = "" Phone_number = "" Site_name = "" Auth_valid_minutes = 3 # Jumlah menit halaman TFA aktif setelah dipakai

Pastikan untuk menyalinnya dari dasbor twilio Anda

Jumlah menit halaman TFA aktif setelah dipakai

Pertama, kami akan membutuhkan formulir untuk dua tampilan otentikasi faktor kami. Mengedit pengguna/forms.py, tambahkan kode berikut.

# ... impor Dari formulir impor Django # Formulir untuk memasukkan nomor telepon kami kelas phonenumberform (forms.form): phone_number = forms.regexfield (regex = r '^\+? 1? \ d {9,15} $', error_messages = {'tidak valid': "Nomor telepon harus dimasukkan dalam format: '+99999999'. Hingga 15 digit diizinkan."}) def __init __ (self, *args, ** kwargs): Super (phonenumberform, self) .__ init __ (*args, ** kwargs) self.fields ['phone_number']. label = phone_number_label # Formulir untuk mengautentikasi kelas tfaform (forms.form): kode = forms.integerfield (wajib = false) def __init __ (self, *args, ** kwargs): Super (tfaform, self) .__ init __ (*args, ** kwargs) self.fields ['code']. widget.attrs.update ({'autocomplete': 'off'}) help_texts = { 'Kode': 'Harap masukkan kode enam digit setelah mengirimnya ke ponsel Anda dengan tombol di atas.' }
nano app/settings.py
… Impor

Formulir untuk memasukkan nomor telepon kami

Formulir untuk mengautentikasi

Selanjutnya, mari kita buat tampilan di pengguna/views.py

# ... impor dari django.http impor httpresponseredirect dari .Forms impor phonenumberform, tfaform def mfa (permintaan, nama pengguna, token): user = user.objects.filter (profile__uuid = username) .first () Jika bukan pengguna: kembalikan httpresponseredirect (reverse ('verifikasi: usia') + '? next =' + request.get.get ('next') jika request.get.get ('next') else '/go/' if request.user.is_Authenticated dan request.user.profile.vendor lain '/' if request.user.user user = get_object_or_404 (user, profile__uuid = nama pengguna) next = request.get.get ('next', '') Jika bukan user.profile.mfa_enabled: Jika tidak check_verification_time (pengguna): user.profile.mfa_enabled = false user.profile.enable_two_factor_authentication = true user.profile.phone_number = '+1' user.profile.save () cetak ('logging in user') auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') Pesan. Warning (permintaan, 'Harap masukkan nomor telepon yang valid dan verifikasi dengan kode.') return redirect (reverse ('pengguna: mfa_onboarding'))) Jika request.method == 'pos': form = tfaform (request.post) kode = form.data ['kode'] Jika kode dan kode! = '' dan kode! = Tidak ada: token_valideded = user.profile.check_auth_token (token) p = user.profile is_verified = check_verification_code (pengguna, int (kode)) p.mfa_authenticated = is_verified Jika token_validasi: jika is_verified: user.profile.mfa_enabled = true user.profile.save () auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') p.VerFication_Code = tidak ada p.uid = get_uuid () p.save () pesan.success (permintaan, 'Anda telah diautentikasi. Selamat datang.') qs = '?' untuk kunci, nilai di request.get.items (): qs = qs + kunci + '=' + nilai + '&' if next! = '' dan not (next.startswith ('/accounts/logout/') atau next.startswith ('/akun/login/') atau next.startswith ('/admin/login/') atau next.startswith ('/akun/register/')): return httpresponseredirect (ext) Elif Next.Startswith ('/Accounts/Logout/') atau Next.Startswith ('/Accounts/Login/') atau Next.Startswith ('/Accounts/Register/'): Return Redirect ('Feed: Feed') Elif request.meta.get ('http_referer', '/').startswith('/accounts/login/'): Return Redirect (Reverse ('Feed: Feed')) Elif Not Next: Returne Redirect (Reverse ('Feed: Feed') kalau tidak: return httpresponseredirect ('feed: feed') kalau tidak: Pesan. Warning (permintaan, 'Kode yang Anda masukkan tidak dikenali. Silakan coba lagi.') Elif Not Token_validasi: Pesan. Peringatan (permintaan, 'Token URL telah kedaluwarsa atau tidak dikenali. Silakan coba lagi.') Logout (permintaan) return redirect (reverse ('pengguna: login')) Jika p.mfa_attempts> 3: Pesan. Peringatan (permintaan, 'Anda telah memasukkan kode yang salah lebih dari 3 kali. Kirimkan kode baru.') p.verification_code = tidak ada p.save () Elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (menit = 2) user.profile.save () send_verification_text (pengguna) Pesan. kalau tidak: Pesan. Peringatan (permintaan, 'Anda mengirim terlalu banyak kode otentikasi dua faktor. Tunggu beberapa menit sebelum mengirim kode lain.') form = tfaform () hide_logo = tidak ada Jika user.profile.hide_logo: hide_logo = true return render (permintaan, 'pengguna/mfa.html', {'title': 'masukkan kode', 'formulir': form, 'xsmall': true, 'user': user, 'hide_logo': hide_logo, 'accl_logout': user.profile.shake_to_logout, 'preload': false ': false}) @login_required def mfa_onboarding (permintaan): Jika request.method == 'pos': form = phonenumberform (request.post) request.user.profile.phone_number = form.data ['phone_number']. ganti ('-', ',' ') .replace (' (',', '). Ganti (') ',' ') request.user.profile.mfa_enabled = true request.user.profile.enable_two_factor_authentication = true request.user.profile.save () pesan.success (permintaan, 'Anda telah menambahkan nomor telepon ke akun Anda.') user = request.user return redirect (user.profile.create_auth_url ())Form = phoneNumberForm (inisial = {'phone_number': request.user.profile.phone_number jika request.user.phile.phone_number else '+1'}) return render (permintaan, 'pengguna/mfa_onboarding.html', {'title': 'masukkan nomor telepon Anda', 'form': form, 'kecil':
SITE_NAME = 'Django App'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = username@server.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
… Impor

Kami juga akan membutuhkan templat untuk kedua pandangan ini. Mari kita tambahkan template MFA terlebih dahulu.

Pengguna Nano/Templat/Pengguna/MFA.html
import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Tambahkan kode HTML ini ke template

{ % meluas 'base.html' %} { % blok konten %} { % Load app_filters %} { % Load crispy_forms_tags %} { % csrf_token %} Masukkan kode verifikasi Langkah 1: Kirim kode Jangan pernah membagikan kode Anda dengan siapa pun, karena dapat digunakan untuk mengakses akun Anda sementara. Kirim kode Langkah 2: Masukkan kode {{Form | Crispy}} Tekan tombol ENTER untuk mengirim sendiri kode di {{User.profile.phone_number | securephone}}. Kemudian, masukkan kode dan tekan ENTER. Masukkan kode { % endblock %}

Ini cukup jelas. Formulir mengirimkan kode atau kode kosong, dan Anda akan melihat di tampilan kami mengirim kode jika kami menerima kode kosong. Kemudian kami hanya memiliki dua tombol kirim, dan dengan cara ini kami dapat mengirim kode dengan kedua tombol. Selanjutnya, kami akan menambahkan formulir sederhana untuk menambahkan nomor telepon.

Pengguna Nano/Templat/Pengguna/MFA_ONBoarding.html

Tambahkan html berikut:
sudo nano /etc/config.json
{ % meluas 'base.html' %} { % blok konten %} { % Load crispy_forms_tags %} { % csrf_token %} Siapkan Dua Faktor Otentikasi {{Form | Crispy}} Tambahkan nomor telepon { % endblock %}

Formulir ini jauh lebih sederhana, hanya membuat formulir nomor telepon yang kami buat dan memungkinkan pengguna menambahkan nomor telepon.

Ini terlihat sangat bagus! Selama semuanya diatur dengan benar, kita harus dapat mengirim pesan, dan mencatat pengguna dengan nomor telepon mereka segera setelah kita menambahkan pola URL. Hal terakhir yang perlu kami atur adalah tampilan profil sehingga kami dapat memastikan pengguna dapat mengubah nomor telepon mereka tanpa masuk. Juga, pada akhirnya kami ingin menambahkan opsi "berhenti untuk berhenti", sehingga pengguna dapat mengirim pesan teks "berhenti" untuk memilih keluar dari pesan teks di masa mendatang.
{
	"EMAIL_HOST_PASSWORD": "<some password here>"
}
Mari kita tambahkan tampilan profil ke pengguna/views.py. Tampilan ini akan memperbarui bio, email, nama pengguna, dan nomor telepon pengguna, serta memungkinkan kami untuk mengaktifkan otentikasi multi -faktor. Pertama, kami akan membutuhkan dua formulir lagi di pengguna/forms.py

#... impor kelas userupdateForm (forms.modelform): email = forms.emailfield () Meta kelas: model = pengguna Fields = ['nama pengguna', 'email'] phone_number_label = 'nomor telepon (tidak ada spasi, tanda kurung \' (\ 'atau dashes \'-\ ', angka yang dimulai dengan + hanya)' Class ProfileUpDateForm (forms.modelform): berlangganan = forms.booleanfield (wajib = false) phone_number = forms.charfield (wajib = false) def __init __ (self, *args, ** kwargs): Super (ProfileUpdateForm, self) .__ init __ (*args, ** kwargs) Meta kelas: model = profil bidang = ['bio', 'phone_number', 'enable_mfa', 'berlangganan']

... impor
nano users/templates/users/verification_email.html
Selanjutnya, kita dapat membuat tampilan untuk menggunakan kedua formulir ini. Edit pengguna/views.py dan tambahkan tampilan.
# Tambahkan impor ini dari .Forms impor userupdateForm, profileupdateForm dari django.views.decorators.cache impor never_cache dari django.views.decorators.csrf impor csrf_exempt Dari .Models Impor Profil dari .mfa impor send_user_text @csrf_exempt @never_cache @login_required profil def (permintaan): Jika request.method == 'pos': u_form = userupdateForm (request.post, instance = request.user) p_form = ProfileUpdateForm (request.post, request.files, instance = request.user.profile) if u_form.is_valid () dan p_form.is_valid (): new_phone_number = p_form.data ['phone_number'] u_form.save () profil = p_form.save (commit = false) profile.phone_number = profile.phone_number.replace ('-', '') .replace ('(', ''). REPLACE (')', '') profile.save () Jika new_phone_number! = oldprofile.phone_number dan oldprofile.phone_number dan len (oldprofile.phone_number)> = 11: profile.mfa_enabled = true profile.save () send_text (oldprofile.phone_number, 'Nomor telepon Anda telah diperbarui ke' + new_phone_number + '. Silakan merujuk ke teks di ponsel itu untuk masuk. Jika Anda tidak melakukan perubahan ini, silakan hubungi kami. - {}'. Format (settings.site_name)))) Jika profile.enable_two_factor_authentication and profile.phone_number dan len (profile.phone_number) <11: profile.enable_two_factor_authentication = false Pesan. profile.save () Jika new_phone_number! = oldprofile.phone_number dan new_phone_number dan len (new_phone_number)> = 11: send_user_text (request.user, 'Anda telah menambahkan nomor ini ke {} untuk dua faktor otentikasi. Anda sekarang dapat menggunakan nomor Anda untuk dua faktor otentikasi. Jika Anda tidak melakukan perubahan ini, silakan hubungi kami. - {}'. Format (settings.site_name, settings.domain))) profile.mfa_enabled = true profile.mfa_code_expires = timezone.now () + datetime.timedelta (menit = 3) profile.save () return redirect (profile.create_auth_url ()) pesan.success (permintaan, profil Anda telah diperbarui! ') cetak ('profil diperbarui') return redirect ('pengguna: profil') kalau tidak: u_form = userupdateForm (instance = request.user) P_FORM = ProfileUpDateForm (instance = request.user.profile, initial = {'phone_number': request.user.profile.phone_number jika request.user.profile.phone_number else '+1'}) konteks = { 'u_form': u_form, 'p_form': p_form, 'Judul': 'Perbarui profil Anda', } return render (permintaan, 'pengguna/profile.html', konteks)

Tambahkan impor ini

Kami juga membutuhkan templat untuk tampilan ini.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'

BASE_URL = PROTOCOL + '://' + DOMAIN
Pengguna Nano/Templat/Pengguna/Profil.html

{ % meluas "base.html" %} { % Load crispy_forms_tags %} {% load feed_filters%} { % blok konten %} Edit profil Anda { % csrf_token %} Info profil {{u_form | crispy}} {{P_FORM | CRISPY}} Memperbarui} Disimpan { % endblock konten %} { % blok javascript %} var form = document.geteLementById ('profile-form'); $ ('input'). ubah (function () { var formdata = FormData baru (form); $ .Ajax ({ URL: window.location.href, Ketik: "Posting", Data: formdata, ProcessData: Salah, ContentType: Salah, Timeout: 1000 * 60, Sukses: function (data) { $ (diposting) .removeclass ("hide"); setTimeout (function () { $ (diposting) .addclass ("fade-hidden"); setTimeout (function () { $ (diposting) .addclass ("hide"); $ (diposting) .removeclass ("fade-hidden"); }, 2000); }, 2000); } }); }); { % endblock %}

Anda akan melihat ini adalah bentuk yang cukup sederhana, tetapi memiliki beberapa javascript di dalamnya yang secara otomatis memposting isi formulir saat diperbarui. Ini berguna untuk dimiliki, jadi Anda dapat mengedit tanpa harus menekan kirim setiap saat.

Selanjutnya, kita membutuhkan URL yang mewakili semua pandangan ini di URL Patters pengguna. Edit pengguna/urls.py dan tambahkan kode ini:

# ... kode sebelumnya, impor dari jalur impor django.urls dari . Impor tampilan app_name = 'pengguna' Urlpatterns = [ # ... Pola URL yang sebelumnya kami masukkan, tambahkan tiga baris berikutnya path ('mfa ///', views.mfa, name = 'mfa'), path ('mfa/onboarding/', views.mfa_onboarding, name = 'mfa_onboarding'), path ('profil/', views.profile, name = 'profile'), ]
nano users/tokens.py
… Kode sebelumnya, impor

… Pola URL yang sebelumnya kami masukkan, tambahkan tiga baris berikutnya

Sekarang adalah saat yang tepat untuk menguji proyek kami. Tapi pertama -tama, mari kita jalankan cadangan lain.
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp)
        )
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
cadangan

Dan jalankan server. Sebelum kita menggunakan server Linux, itu ide yang bagus untuk mengaktifkan otentikasi dua faktor pada akun. Kami akan melakukan ini pergi ke URL profil kami,/pengguna/profil/, dan mencentang kotak untuk mengaktifkan otentikasi setelah memasukkan nomor telepon kami, dan kemudian mengirimkan formulir.

python manager.py runserver localhost: 8000

Kunjungi halaman web dengan pergi ke browser web Anda, saya menggunakan Google Chrome dalam contoh ini, dan memasukkan URL https: // localhost: 8000/akun/profil/

Anda akan dapat masuk jika perlu dan mengaktifkan otentikasi dua faktor.
nano users/email.py
Proyek ini membutuhkan server untuk berjalan sehingga dapat benar -benar mengirim surat. Tapi pertama -tama, kita membutuhkan cara untuk melihat kesalahan. Anda akan melihat bahwa jika Anda menjalankan server dalam mode debug, dengan pengaturan.debug sama dengan True, server menunjukkan kesalahan secara otomatis. Untuk menunjukkan kesalahan tanpa menggunakan mode debug, yang tidak aman di server produksi, kita harus menambahkan tampilan untuk itu. Kesalahan terpenting yang perlu kita tangani adalah:

Kesalahan 500 - Masalah dengan kode kami Kesalahan 404 - Halaman yang tidak ditemukan (URL rusak) Kesalahan 403 - Kesalahan Izin Ditolak

Mari kita tambahkan aplikasi baru untuk menangani kesalahan ini, yang disebut kesalahan.
from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback

def send_verification_email(user):
    User = get_user_model()
    mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
    html_message = render_to_string('users/verification_email.html', {
        'user': user,
        'domain': settings.DOMAIN,
        'protocol': 'https',
        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
        'token': account_activation_token.make_token(user),
    })
    send_html_email(user, mail_subject, html_message)
Python Manager.py StartApp Kesalahan

Tambahkan ini ke settings.py seperti yang kami lakukan sebelumnya, dalam pengaturan Installed_Apps, dan mulailah dengan menambahkan referensi ke beberapa tampilan di aplikasi/urls.py, di mana aplikasi adalah nama proyek Django Anda.

handler404 = 'errors.views.handler404' handler500 = 'errors.views.handler500' handler403 = 'errors.views.handler403'
def send_html_email(user, mail_subject, html_message):
    to_email = user.email
    username = user.username
    if to_email == '':
        return None
    unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
    html_message = html_message + "<p><a href=\"" + unsub_link +  "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
    msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
    msg.attach_alternative(html_message, "text/html")
    profile = user.profile
    try:
        msg.send(fail_silently=False)
        if not profile.email_valid:
            profile.email_valid=True
            profile.save()
    except:
        profile.email_valid=False
        profile.save()
Ini semua yang kita butuhkan selain tampilan kesalahan, templat, dan sedikit middleware. Mari kita tentukan itu seperti:

dari django.shortcuts impor render, redirect dari django.http impor httpresponse dari stacktrace.models Import error dari errors.middleware impor get_current_exception dari django.contrib.auth.decorators impor login_required dari django.contrib.auth.decorators impor user_passes_test dari .logs impor get_logs dari face.tests impor is_superuser_or_vendor dari django.views.decorators.csrf impor csrf_exempt dari kesalahan. Highlight Impor Sorotan_Code dari django.shortcuts impor pengalihan dari django.urls impor terbalik # Buat pandangan Anda di sini. @login_required @user_passes_test (is_superuser_or_vendor) Def Log (permintaan): Logs = sorot_code (get_logs ()) return render (permintaan, 'kesalahan/live_error.html', {'title': 'kesalahan log', 'pagetitle': 'log kesalahan', 'catatan': 'Ini adalah log kesalahan terbaru.', 'jejak': log, 'full': true}) @login_required @user_passes_test (is_superuser_or_vendor) Def LOGS_API (permintaan): Logs = sorot_code (get_logs ()) return httpresponse (log) @login_required def handler404 (permintaan, pengecualian): Jika tidak meminta.path.endswith ('/'): return redirect (request.path + '/') return render (permintaan, 'kesalahan/error.html', {'title': 'error 404', 'pagetitle': 'error 404', 'notes': 'Halaman ini tidak ditemukan di server. Ini mungkin telah bergerak atau dihapus.', 'is_404': true})) def handler500 (permintaan): print (get_current_exception ()) pengguna = tidak ada jika hasattr (permintaan, 'pengguna') dan request.user dan request.user.is_authenticated: user = request.user mencoba: Error.objects.create (user = user, stack_trace = get_current_exception (), notes = 'dicatat oleh 500 pawang.') kecuali: lulus return render (permintaan, 'errors/error.html', {'title': 'error 500', 'pagetitle': 'error 500', 'notes': 'Ada masalah dengan server, atau dengan permintaan yang datang dari Anda. Terima kasih atas pemahaman Anda saat kami mendapatkan sesuatu yang diatur.', 'TRACE': GET_CURRENTE ()) def handler403 (permintaan, pengecualian): return render (permintaan, 'errors/error.html', {'title': 'error 403', 'pagetitle': 'error 403', 'notes': 'Anda tidak memiliki izin untuk membentuk permintaan ini. Jika Anda berpikir kesalahan, silakan hubungi administrator server.', 'IS_403': true})) def handler400 (permintaan, pengecualian): return render (request, 'errors/error.html', {'title': 'error 400', 'pagetitle': 'error 400', 'notes': 'Ini adalah permintaan yang buruk.'})

Buat pandangan Anda di sini.

Selanjutnya, mari kita tentukan middleware untuk menangani kesalahan ini. Kami akan melakukan ini dengan terlebih dahulu menambahkan ke middleware_classes di settings.py, dengan nama middleware kami.

Middleware_classes = [ #... middleware sebelumnya 'errors.middleware.exceptionVerboSemiddleware, ]

... middleware sebelumnya

Selanjutnya, mari tambahkan middleware.
nano users/models.py
dari Threading Impor Lokal Impor Traceback dari django.utils.deprecation impor middlewaremixin _Error = local () Class ExceptionVerboSemiddleware (Middlewaremixin): Def Prosess_Exception (self, request, Exception): _error.value = traceback.format_exc () def get_current_exception (): mencoba: return _Error.Value Kecuali atributeRror: tidak ada yang kembali def set_current_exception (pengecualian): mencoba: _Error.Value = Exception Kecuali atributeRror: print ('Pengaturan Pengaturan Kesalahan Atribut.')
# Kami menambahkan fungsi untuk mendapatkan pengecualian saat ini dengan menggunakan threading lokal, yang membantu kami melacak kesalahan dalam kode kami. Dalam hal template, kami hanya perlu satu, karena kami secara dinamis mendefinisikan judul dalam tampilan. Template hanya perlu membuat judul dan "melacak", Traceback kesalahan kami dari konteks.
Kesalahan Nano/Templat/Kesalahan/Kesalahan.html

{ % meluas 'base.html' %} { % blok konten %} {{pagetitle}} {{ jejak }} { % endblock %}

Ini adalah templat paling sederhana kami, tapi begitulah mudahnya melihat kesalahan dalam proyek kami. Selanjutnya, mari kita nonaktifkan debug dalam pengaturan.
# nano app/settings.py
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Temukan baris ini di mana diatur ke true, dan ubah menjadi false
Debug = false

Silakan dan cadangkan aplikasi sekarang. Kami siap digunakan ke server Linux jarak jauh, dan terus menambahkan fitur dari sana.

cadangan sudo

Sebelum kami memposting kode ini ke server, kami harus mempertimbangkan bahwa mungkin ada beberapa masalah dengan kode. Bergantung pada kasusnya, situs yang menerima informasi yang diposting kepada mereka akan memiliki masalah dengan spam yang diposting dan kesulitan menghapus spam. Ini seharusnya tidak terjadi segera, tetapi jika itu terjadi, kita kemudian akan memeriksa cara memoderasi spam secara otomatis di situs dan membuatnya lebih sulit bagi robot untuk mengakses situs, bersama dengan cara menonaktifkan akun pengguna, dan memverifikasi identitas pengguna dengan pemindaian ID mereka atau pemindaian biometrik, seperti pengenalan jari atau pengenalan wajah.

Melihat contoh otentikasi multi -faktor yang kami periksa, dalam produksi, hal -hal bisa berbeda. Perhatikan bagaimana kami membatasi login, dan token yang kedaluwarsa. Jika robot mengakses situs, dua faktor otentikasi bisa lebih sulit karena mereka dapat memasukkan kode pada saat yang sama pengguna. Untuk mengatasi ini, mari kita gunakan model dalam model pengguna, menyatakan bagaimana kami berinteraksi dengan situs ketika kami mengotentikasi menggunakan otentikasi multi -faktor dengan nomor telepon. Kami juga akan menambahkan opsi untuk mengotentikasi dengan email. Mulailah dengan mengedit model pengguna dengan nano.
nano users/views.py
pengguna nano/model.py

Seperti inilah model yang kita tambahkan seharusnya. Kami tidak memerlukan metode apa pun, hanya variabel untuk menyimpan ID, pengguna, stempel waktu, kedaluwarsa, panjang dan upaya terhadap otentikasi multi -faktor apa pun (kode seperti 123456 dikirim ke telepon atau email).

# Token dasar yang digunakan untuk masuk ke situs web Kelas mFatoken (model.model): user = model.foreignKey (pengguna, on_delete = model.cascade, terkait_name = 'mfa_tokens') timestamp = model.dateTimefield (default = timezone.now) Expires = Model.DateTimefield (default = timezone.now) token = model.charfield (default = '', max_length = 100) length = model.integerfield (default = 6) upaya = model.integerfield (default = 0) uid = model.charfield (default = uuid.uuid4, max_length = 100)
from .email import send_verification_email # Token dasar yang digunakan untuk masuk ke situs web
Mari kita juga menambahkan hak istimewa kepada pengguna kami, dan kami akan mengaturnya secara manual untuk saat ini, sebelum akhirnya bermigrasi ke mendaftar pengguna istimewa secara otomatis. Di model pengguna, tambahkan baris ini di profil:

vendor = model.booleanfield (default = false)

Seperti halnya perubahan pada database, kita perlu membuat migrasi dan memigrasikan database setiap kali kita mengedit file model.py di Django. Ingat, untuk melakukan ini, kami menggunakan sumber terlebih dahulu (jika belum digunakan karena terminal terbuka) dan kemudian Python mengelola.py untuk membuat migrasi dan bermigrasi.

CD proyek-direktori-you-named # (jika diperlukan) Sumber venv/bin/aktifkan python manager.py makemigrasi && python manager.py migrasi

(jika perlu)
        # Untuk saat ini, Anda dapat meminta akun apa pun yang telah Anda buat sebagai vendor dengan menggunakan shell.
    # python kelola.py shell
dari users.models impor profil
p = profile.objects.get (user__username = 'charlotte')
p.vendor = true
p.save ()
KELUAR()
# Sekarang, mari kita berevolusi tampilan otentikasi multi -faktor kami untuk menggunakan token ini. Pertama, kita perlu memodifikasi utilitas pembantu MFA kami. Menggunakan nano,
pengguna nano/mfa.py

dari django.utils impor zona waktu impor acak impor datetime dari pengaturan impor django.conf dari feed.middleware impor get_current_request dari Django.contrib Impor pesan dari .mail impor send_html_email Impor Traceback dari .models impor mfatoken Account_sid = settings.twilio_account_sid auth_token = settings.twilio_auth_token source_phone = settings.phone_number def send_text (target_phone, teks): dari Twilio.Rest Import Client mencoba: klien = klien (Account_sid, auth_token) Jika len (target_phone)> = 11: pesan = client.messages.create ( ke = target_phone, from_ = source_phone, body = text + 'Teks berhenti membatalkan.') kecuali: pesan.warning (get_current_request (), 'Ada kesalahan yang mengirim pesan.') print (traceback.format_exc ()) def get_num_length (num, panjang): n = '' untuk x dalam kisaran (panjang): n = n + str (num) return int (n) def send_verification_text (pengguna, token): length = user.profile.verification_code_length kode = random.randint (get_num_length (1, panjang), get_num_length (9, panjang)); token.token = kode token.expires = timezone.now () + datetime.timedelta (menit = settings.auth_valid_minutes) token.save () send_user_text (pengguna, "kode verifikasi Anda untuk {} adalah {}". Format (settings.site_name, str (kode)))) def send_verification_email (pengguna, token): length = user.profile.verification_code_length kode = random.randint (get_num_length (1, panjang), get_num_length (9, panjang)); token.token = kode token.expires = timezone.now () + datetime.timedelta (menit = settings.auth_valid_minutes) token.save () send_html_email (user, "kode verifikasi Anda untuk {} adalah {}". str (kode), str (kode), settings.site_name)) def send_user_text (pengguna, teks): send_text (user.profile.phone_number, teks) def check_verification_code (pengguna, token, kode): token.Attempts = token.Attempts + 1 profil = user.profile hasil = (token! = Tidak ada dan kode! = '' dan token.token == kode dan (token.exires> timezone.now ()) dan token.attempts <= settings.mfa_token_attempts) Jika token.Attempts <3 dan hasilnya: profile.verification_code_length = 6 Elif token.Attempts> 1 dan bukan hasilnya: profile.verification_code_length = profile.verification_code_length + 2 Jika profile.verification_code_length> settings.mfa_token_length: profile.verification_code_length = settings.mfa_token_length token.save () profile.save () hasil pengembalian

# Mengotentikasi pengguna menggunakan email atau nomor telepon mereka def mfa (permintaan, nama pengguna, usertoken): token = mFaToken.objects.filter (uid = username, kedaluwarsa__gt = timezone.now () + datetime.timedelta (detik = 30)). order_by ('-timestamp'). Last () # Saring token dengan nilai yang ditularkan dalam url (a uuid) Jika bukan token: token = mFaToken.Objects.create (user = user.objects.filter (profile__uuid = username) .first (), uid = nama pengguna, kedaluwarsa = timeZone.now () + datetime.timedelta (detik = 115)) # Jika sesi ini belum dibuat, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, ciptakan itu, create ite, detik = detik = 115)) # Jika sesi ini belum dibuat, create ite, create ite, detik = detik = 115)) # user = user.objects.filter (id = token.user.id) .first () # Dapatkan pengguna dari token Jika bukan pengguna dan request.user.is_authenticated: return redirect (reverse ('feed: home')) # Jika sudah diautentikasi, login Jika bukan pengguna: Naikkan izin () # tolak jika tidak ada pengguna yang ditemukan next = request.get.get ('next', '') Jika bukan user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token (userToken, token): # periksa token auth auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') # log in pengguna jika belum masuk user.profile.mfa_expires = timezone.now () + datetime.timedelta (menit = settings.login_valid_minutes) # Tetapkan kedaluwarsa pada otentikasi multi -faktor mereka user.profile.save () kembalikan httpresponseredirect (selanjutnya jika selanjutnya! = '' lain Reverse ('Landing: Landing')) # Redirect Pengguna ke halaman berikutnya Jika bukan user.profile.mfa_enabled: # periksa apakah MFA diaktifkan Jika tidak check_verification_time (pengguna, token): # periksa waktu user.profile.mfa_enabled = false # hapus nomor telepon user.profile.enable_two_factor_authentication = true # aktifkan mfa user.profile.phone_number = '+1' # Nonaktifkan nomor telepon user.profile.save () # simpan profil AUTH_LOGIN (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') # log pengguna jika mfa mereka tidak diaktifkan Pesan. Warning (permintaan, 'Harap masukkan nomor telepon yang valid dan verifikasi dengan kode.') return redirect (reverse ('pengguna: mfa_onboarding'))) Jika request.method == 'pos' dan bukan fraud_detect (request, true): # Jika permintaan adalah permintaan postingan Formulir = tfaform (request.post) # instantiate formulir kode = str (form.data.get ('kode', tidak ada)) # dapatkan kode Jika kode dan kode! = '' dan kode! = Tidak ada: # Pastikan itu tidak kosong token_valideded = user.profile.check_auth_token (userToken) # Periksa token auth p = user.profile is_verified = check_verification_code (pengguna, token, kode) # periksa kode p.mfa_authenticated = is_verified Jika token_validasi: # jika semuanya jika is_verified: # sedang berurutan user.profile.mfa_enabled = true # aktifkan mfa (jika belum diaktifkan) user.profile.save () auth_login (permintaan, pengguna, backend = 'django.contrib.auth.backends.modelbackend') # login pengguna face = user.faces.filter (session_key = none) .last () p.mfa_expires = timezone.now () + datetime.timedelta (menit = settings.login_valid_minutes) p.save () pesan.success (permintaan, 'Anda telah diautentikasi. Selamat datang.') qs = '?' Untuk kunci, nilai di request.get.items (): # Bangun QueryString untuk parameter berikutnya (jika ada) qs = qs + kunci + '=' + nilai + '&' if next! = '' dan not (next.startswith ('/accounts/logout/') atau next.startswith ('/akun/login/') atau next.startswith ('/admin/login/') atau next.startswith ('/akun/register/')): kembalikan httpresponseredirect (selanjutnya) # redirect Elif Next.Startswith ('/Accounts/Logout/') atau Next.Startswith ('/Accounts/Login/') atau Next.Startswith ('/Accounts/Register/'): Return Redirect (Reverse ('/')) Elif request.meta.get ('http_referer', '/').startswith('/accounts/login/'): Return Redirect (Reverse ('/')) Elif Not Next: Return Redirect (Reverse ('/')) kalau tidak: return httpresponseredirect (reverse ('verifikasi: usia') + '? next =' + request.meta.get ('http_referer', '/')))) kalau tidak: Pesan. Warning (permintaan, 'Kode yang Anda masukkan tidak dikenali. Silakan coba lagi.') Elif Not Token_validasi: # Jika tokennya tidak valid Pesan. Peringatan (permintaan, 'Token URL telah kedaluwarsa atau tidak dikenali. Silakan coba lagi.') Logout (permintaan) return redirect (reverse ('pengguna: login')) Jika p.mfa_attempts> 3: # Jika ada terlalu banyak upaya Pesan. Peringatan (permintaan, 'Andatelah memasukkan kode yang salah lebih dari 3 kali. Kirimkan kode baru. ') p.verification_code = tidak ada p.save () Elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (menit = 2) user.profile.save () if form.data.get ('send_email', false): # kirim email (atau teks) send_mfa_verification_email (pengguna, token) kalau tidak: send_verification_text (pengguna, token) Pesan. Elif user.profile.can_send_mfa <timezone.now () + datetime.timedelta (detik = 115): Pesan. Peringatan (permintaan, 'Anda mengirim terlalu banyak kode otentikasi dua faktor. Tunggu beberapa menit sebelum mengirim kode lain.') form = tfaform () hide_logo = tidak ada Jika user.profile.hide_logo: hide_logo = true Jika request.user.is_authenticated: return redirect (reverse ('/')) # Render formulir (untuk mendapatkan permintaan) return render (permintaan, 'pengguna/mfa.html', {'title': 'masukkan kode', 'formulir': form, 'xsmall': true, 'user': user, 'hide_logo': hide_logo, 'accl_logout': user.profile.shake_to_logout, 'preload': false, 'false,' false, 'foate,' foatof
nano users/views.py
Mengotentikasi pengguna menggunakan email atau nomor telepon mereka
# Saring token dengan nilai yang diteruskan di URL (A UUID)
# Jika sesi ini belum dibuat, buatlah
Dapatkan pengguna dari token

Jika sudah diautentikasi, login

Tolak jika tidak ada pengguna yang ditemukan
# Periksa token auth
            send_verification_email(user) # Masuk pengguna jika belum masuk
Tetapkan kedaluwarsa pada otentikasi multi -faktor mereka

Mengalihkan pengguna ke halaman berikutnya

Periksa apakah MFA diaktifkan
# Periksa waktu
Bersihkan Nomor Telepon

Aktifkan MFA

Nonaktifkan Nomor Telepon
nano users/templates/users/resend_activation.html
Simpan profil

Masuki pengguna jika MFA mereka tidak diaktifkan

Jika permintaan adalah permintaan pos
Instantiate formulir

Dapatkan kodenya

Pastikan itu tidak kosong
def sendwelcomeemail(user):
    User = get_user_model()
    html = open('{}/users/welcome_email.html'.format(settings.BASE_DIR)).read()
    subject = 'Welcome to ' + settings.SITE_NAME + ', {{ username }}!'
    template = Template(html)
    subjtemplate = Template(subject)
    context = Context({'username': user.username, 'base_url': settings.BASE_URL, 'model_name': 'Daisy Holton, 'site_name': settings.SITE_NAME})
    renderedtemplate = template.render(context)
    subjcontext = Context({'username': user.username})
    subjrenderedtemplate = subjtemplate.render(subjcontext)
    send_html_email(user, subjrenderedtemplate, renderedtemplate)
Periksa token auth

Periksa kodenya

Jika semuanya
Beres

Aktifkan MFA (jika belum diaktifkan)

Masuk Pengguna

Bangun querystring untuk parameter berikutnya (jika ada)

Redirect

Jika tokennya tidak valid

Jika ada terlalu banyak upaya
# Kirim email (atau teks)
Render formulir (untuk mendapatkan permintaan)

Saat kami menambahkan kode ini, pastikan untuk mengimpor fungsi untuk mengirim email. Di bagian atas file, pengguna melihat (dengan impor lainnya), tambahkan

dari .mfa impor send_verification_email sebagai send_mfa_verification_email
Sekarang, kita perlu menulis fungsi itu sebelum semua ini akan berhasil. Ini harus memperpanjang fungsi Kirim Email kami, dan cukup kirim email ke pengguna dengan kode verifikasi.

pengguna nano/mfa.py

def send_verification_email (pengguna, token): length = user.profile.verification_code_length kode = random.randint (get_num_length (1, panjang), get_num_length (9, panjang)); token.token = kode token.expires = timezone.now () + datetime.timedelta (menit = settings.auth_valid_minutes) token.save () send_html_email (user, "kode verifikasi Anda untuk {} adalah {}". str (kode), str (kode), settings.site_name))
Jadi ini semua berfungsi dengan baik, sekarang kami memiliki sistem otentikasi multi -faktor yang tergantung pada nomor telepon atau email untuk masuk. Tetapi kami juga membutuhkan cara untuk menghapus, atau setidaknya menyembunyikan pengguna yang tidak bekerja sama dengan persyaratan kami. Ini bisa berupa spammer, robot atau siapa pun yang tidak bermaksud baik untuk pekerjaan kami. Lihatlah tampilan yang saya miliki untuk memantau pengguna di situs web saya:

# Impor dari django.contrib.auth.decorators impor login_required dari django.contrib.auth.decorators impor user_passes_test Dari. Tests Impor IS_SUPERUSER_OR_VENDOR # Kita perlu membuat tes ini @login_required @user_passes_test (is_superuser_or_vendor) Pengguna Def (Permintaan): # Dapatkan daftar pengguna new_today = user.objects.filter (is_active = true, date_joined__gte = timezone.now () - datetime.timedelta (jam = 24)). count () new_this_month = user.objects.filter (is_active = true, date_joined__gte = timezone.now () - datetime.timedelta (jam = 24*30)). Count () pelanggan = user.objects.filter (is_active = true, profile__subscribed = true) .count () return render (request, 'users/user.html', { # return pengguna dalam templat 'judul': 'semua akun', 'Pengguna': user.objects.all (), 'new_today': new_today, 'new_this_month': new_this_month, 'Pelanggan': Pelanggan })

impor
Kami perlu membuat tes ini

Dapatkan daftar pengguna

Mengembalikan pengguna dalam templat
Perhatikan bahwa kode ini menggunakan tes, kita perlu mendeklarasikan tes ini dalam file tests.py dan mengimpornya. Mengedit pengguna/tests.py, mari kita buat tes.

def is_superuser_or_vendor (pengguna): kembalikan user.profile.vendor atau user.is_superuser

Ini bersamaan dengan Template Pengguna/Pengguna.html, yang terlihat seperti ini:
{ % meluas 'base.html' %} { % Load app_filters %} { % blok konten %} Semua pengunjung terdaftar {{new_today | nts | capitize}} baru hari ini, {{new_this_month | nts}} baru bulan ini, {{pelanggan | nts}} pelanggan, {{{Users.count | nts}} total. { % untuk pengguna di pengguna %} { % Termasuk 'pengguna/_user.html' %} { % endfor %} { % endblock %}

user.html. Saat menggunakan templat yang memiliki subtemplate dan tidak menggunakan Extends, itu ide yang bagus untuk menambahkan garis bawah (

Perhatikan bahwa ini adalah banyak jinja, Anda mungkin tidak memiliki semua variabel ini. Tapi seperti inilah kode saya.
    # { % Load app_filters %}


    
      @{{User.UserName}} - {{{user.profile.name}} ({{{user.profile.preferred_name}})
      Terakhir terlihat {{user.profile.last_seen | date: "f d, y"}} {{user.profile.last_seen | waktu: "h: i"}}
      Bergabung di {{User.Profile.Date_Joined | Tanggal: "f d, y"}} {{user.profile.date_joined | waktu: "h: i"}}
      {{user.email}}
      { % if user.profile.phone_number %} {{user.profile.phone_number}} { % endif %}
      { % Jika user.verifications.last %}
      '{{User.Verifications.Last.FULL_NAME}}'
       {{User.Verifications.Last.Document_Number}}
       {{User.Verifications.Last.BIRTHDATE}}
       ID depan
       Id kembali
      { % endif %}
      #{{User.id}}
      { % if user.profile.subscribed %} berlangganan { % else %} tidak berlangganan { % endif %}
    
    { %jika bukan user.is_superuser %}
    { % Termasuk 'pengguna/toggle_active.html' %}
    { % endif %}
    { % autoescape off %}    
    {{user.bio}}
    { % endautoescape %}
    
    { % if user.profile.identity_verified %} Pengguna terverifikasi. { % else %} pengguna yang tidak diverifikasi. { % endif %} verifikasi: {{{user.verifications.count | nts}}
{{user.id}} </small>

Kami juga membutuhkan subtemplate lain, toggle_active.html. Template ini harus menjadi formulir yang memungkinkan kita untuk beralih apakah pengguna aktif.

{ % if user.is_active %} { % else %} { % endif %}

Kami juga perlu menambahkan tampilan untuk beralih aktivitas pengguna, dan pola URL yang sesuai. Sementara kita melakukannya, mari kita tambahkan tampilan untuk menghapus pengguna jika kita membutuhkannya.

dari django.views.decorators.csrf impor csrf_exempt @csrf_exempt @login_required @user_passes_test (is_superuser_or_vendor) def toggle_user_active (permintaan, pk): user = user.objects.get (id = pk) Jika request.method == 'pos': user.is_active = not user.is_active user.save () return httpresponse ('' if user.is_active else '') # Impor dari django.contrib.auth.mixins impor loginrequiredMixin, userpassestMixin dari django.views.generic impor deleteview Kelas userDeleteview (LoginRequiredMixin, UserPassestMixin, Deleteview): model = pengguna Success_Url = '/' # Redirect pada URL sukses def get_context_data (self, ** kwargs): konteks = super (). get_context_data (** kwargs) Konteks pengembalian def test_func (self): # tes jika pengguna superuser dan memiliki izin untuk menghapus user = self.get_object () Jika self.request.user! = USER dan self.Request.user.is_superuser: kembali benar mengembalikan false

Impor

Redirect pada URL sukses
# Menguji apakah pengguna superuser dan memiliki izin untuk menghapus
    # Meskipun ini praktis bila perlu, menghapus pengguna seharusnya tidak perlu sebagian besar waktu, kami hanya dapat beralih visibilitas pengguna yang mengunjungi situs jika kami perlu mengabaikannya.
    # Pola URL yang kami tambahkan terlihat seperti ini. Dengan Nano, edit pengguna/urls.py dan tambahkan baris ini:
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Pengguna Nano/urls.py
Baris harus masuk dalam daftar jalur dalam tampilan pengguna, sebelum akhir "]" tetapi setelah awal "[".

# ... path ('user // delete/', userdeleteview.as_view (template_name = 'blog/user_confirm_delete.html'), name = 'delete-user'), path ('user // active/', views.toggle_user_active, name = 'toggle-user-active'), # ...

...
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
...

Sekarang, pastikan untuk mencadangkan situs sehingga Anda dapat mengunduhnya di server web yang akan terus kami kerjakan. Dari baris perintah,

cadangan sudo

Sekarang situs kami didukung.

Jadi sekarang kami memiliki beberapa fitur yang lebih berguna. Tapi bagaimana dengan gambaran besar di sini? Kode ini masih belum dapat diakses dari internet, kami belum memiliki server surat, dan kami perlu memperluas aplikasi kami untuk memasukkan proses verifikasi komprehensif serta tata letak yang halus untuk membantu kami menjelajahi Situs, bersama dengan protokol yang aman untuk mengautentikasi pengguna istimewa.
# Kami akan mencapai semua ini. Hal terpenting untuk saat ini hanya adalah mendapatkan kode ini secara online, yang dapat kami lakukan hanya dengan beberapa baris bash di server Ubuntu. Anda perlu menyewa server untuk ini, kecuali jika Anda memiliki server di rumah dan langganan internet bisnis yang memungkinkan Anda membuka port. Saya pribadi menjalankan situs web saya di HP Z440 yang diinstal di apartemen saya, tetapi biasanya jauh lebih murah untuk kebutuhan dasar untuk menyewa server pribadi virtual (VPS).
        if user and user.profile.can_login < timezone.now(): # Perlu diingat bahwa kode yang kami jalankan sekarang relatif tipis, itu perlu dipertahankan dan ditingkatkan sebelum kami siap menggunakan apa yang harus kami bangun produk. Pastikan untuk berhati -hati dengan apa yang Anda lakukan dengan internet, pastikan jika Anda menggunakan situs ini secara publik ke web di server Linux, Anda memiliki rencana untuk memblokir interaksi yang tidak diinginkan dengan situs web Anda. Ini kemungkinan tidak akan menjadi masalah pada awalnya, tetapi kami akan melihat berbagai solusi untuk memerangi ini, termasuk pembelajaran mesin, kecerdasan buatan dan visi komputer. Ketika itu menjadi masalah, lihat lebih jauh dalam teks ini untuk solusi.
            # Dalam hal menyewa VPS, ada banyak tempat yang bisa Anda kunjungi. Google Cloud memiliki server VPS, Ionos, Kamatera, Amazon AWS, dan lebih banyak penyedia menawarkan solusi server cloud yang sesuai dengan kebutuhan kita.
                return redirect(user.profile.create_auth_url()) # Anda harus mengklik formulir mereka dan memilih rencana untuk memulai. Anda dapat menggunakan paket dasar dengan penyedia apa pun, tetapi pastikan penyedia memungkinkan Anda untuk membuka port server mail port untuk mengirim email (ini harus port 587 dan port 25), beberapa penyedia memblokir port ini. Sejauh ini saya memiliki pengalaman terbaik dengan Ionos dan Kamatera, keduanya akan memungkinkan saya untuk mengirim email tanpa batas dan harga mereka cukup murah.
            else: # Anda akan terhubung ke server baru Anda melalui protokol yang disebut SSH atau Secure Shell, yang memungkinkan Anda untuk berinteraksi dengan server persis seperti komputer pribadi Anda, dari komputer pribadi Anda. Saat Anda mengatur server, penyedia hosting kemungkinan akan meminta Anda untuk menambahkan kunci SSH, atau mereka akan memberi Anda nama pengguna dan kata sandi. Kunci SSH adalah bagaimana Anda akan masuk ke server dari baris perintah untuk mengedit kode. Gunakan opsi ssh-keygen di bawah ini untuk menghasilkan kunci SSH.
        else: # ssh-keygen
            user = User.objects.filter(username=username).first() # Simpan file dan timpa jika Anda perlu, ada baiknya memutar kunci SSH Anda jika Anda belum melakukannya. Sekarang, Anda dapat menggunakan perintah berikut untuk melihat kunci SSH Anda. Anda ingin menyalinnya ke server jarak jauh Anda sehingga Anda dapat menggunakannya untuk mengotentikasi.
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Cat ~/.ssh/id_rsa.pub
Jika Anda tidak dapat melihat kunci SSH saat mengetikkan perintah itu (serangkaian angka panjang dan huruf yang dimulai dengan "SSH-RSA AAA"), coba hasilkan kunci RSA (mereka lebih aman, jadi saya sarankan untuk menggunakannya.) Kode berikut akan menghasilkan kunci SSH RSA 4096 bit.

ssh -keygen -t rsa -b 4096

Buat VPS yang menjalankan Ubuntu, namun Anda berencana untuk melakukan ini. Setelah Anda membuat VPS dengan mengklik formulir di situs web Penyedia (Kamatera.com, Ionos.com atau yang serupa), Anda ingin masuk. Untuk melakukan ini, gunakan perintah SSH dengan alamat IP Anda (alamat yang terlihat seperti xx.xx.xx.xx). Anda juga harus peka terhadap nama pengguna default di server yang kami buat, misalnya, Ubuntu.

ssh ubuntu@xx.xx.xx.xx

Anda mungkin diminta kata sandi, jika Anda diminta kata sandi, masukkan. Kami tidak akan menggunakan nama pengguna default, jadi mari kita mulai dengan membuat pengguna baru dan menambahkan kunci SSH ke akun mereka.
nano users/sms.py
Mari kita mulai dengan menambahkan file sshd_config baru, yang memberi tahu server cara menggunakan ssh.
# Nano sshd_config
# # Ini adalah file konfigurasi sistem SSHD Server di seluruh sistem.  Melihat
# sshd_config (5) untuk informasi lebih lanjut.

# SSHD ini dikompilasi dengan path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# Strategi yang digunakan untuk opsi di SSHD_Config default yang dikirim dengan
# OpenSsh adalah menentukan opsi dengan nilai default di mana
# mungkin, tapi tinggalkan berkomentar.  Opsi yang tidak dikomentasikan mengesampingkan
# Nilai default.

#Port 22
#Addressfamily apapun
#Listenaddress 0.0.0.0
#Listenaddress ::

#Hostkey/etc/ssh/ssh_host_rsa_key
#Hostkey/etc/ssh/ssh_host_ecsa_key
#Hostkey/etc/ssh/ssh_host_ed25519_key

# Cipher dan kunci
#RekeyLimit tidak ada

# Logging
#Syslogfacility auth
Info #LogLevel

# Otentikasi:

#Logingracetime 2m
#PerMitrootlogin Larangan-Password
#Strictmodes ya
#MaxAuthtries 6
#MaxSessions 10

PubKeyAuthentication Ya

# Harapkan .ssh/otorisasi_keys2 diabaikan secara default di masa depan.
OtorationKeysfile .ssh/otorisasi_keys .ssh/otorisasi_keys2

#AuthorizedPrincipsfile tidak ada

#AuthorizedKeyScommand tidak ada
#AuthorizedKeyScommanduser NOBOHNE

# Agar ini berfungsi, Anda juga akan membutuhkan kunci host di/etc/ssh/ssh_nown_hosts
#HostbasedAuthentication no
# Ubah ke ya jika Anda tidak mempercayai ~/.ssh/know_hosts untuk
# HostbasedAuthentication
#IgnoreUsernelinghosts no
# Jangan membaca file pengguna ~/.rhosts dan ~/.shosts
#Ignorerhosts ya

# Untuk menonaktifkan kata sandi teks yang jelas, ubah menjadi tidak di sini!
Kata sandi no
#Permitemptypasswords no

# Ubah ke ya untuk mengaktifkan kata sandi tantangan-respons (waspadai masalah dengan
# Beberapa modul dan utas PAM)
KBDinterActiveAuthentication no

# Opsi Kerberos
#KerberosAuthentication no
#Kerberosorlocalpasswd ya
#KerBeroSticketCleanup Ya
#Kerberosgetafstoken no

# Opsi GSSAPI
#GssapiaThentication no
#Gssapicleanupcredentials ya
#Gssapistrictacceptorcheck ya
#Gssapikeyexchange no

# Setel ini ke 'ya' untuk mengaktifkan otentikasi PAM, pemrosesan akun,
# dan pemrosesan sesi. Jika ini diaktifkan, otentikasi PAM akan
# diizinkan melalui KBDinterActiveAuthentication dan
# PasswordAuthentication.  Tergantung pada konfigurasi PAM Anda,
# PAM Otentikasi melalui KBDInterActiveAuthentication May Bypass
# Pengaturan "permitrootlogin tanpa kata-kata".
# Jika Anda hanya ingin akun PAM dan pemeriksaan sesi berjalan tanpa
# Otentikasi Pam, lalu aktifkan ini tetapi atur kata sandi
# dan KBDinterActiveAuthentication menjadi 'Tidak'.
Usepam ya

#AllowAgentForwarding Ya
#Allowtcpforwarding ya
#Gatewayports no
X11 untuk ya
#X11DisplayOffset 10
#X11uselocalhost Ya
#Permittty ya
Printmotd no
#Printlastlog ya
#TcpeepaLive ya
#Permituserenvironment no
#Kompresi tertunda
#ClientAliveInterval 0
#Clientalivecountmax 3
#Sedns no
#Pidfile /run/sshd.pid
#MaxStartups 10: 30: 100
#Permittunnel no
#CrootDirectory tidak ada
#VersionAddendum tidak ada

# tidak ada jalur spanduk default
Banner /etc /spanduk

# Izinkan klien untuk lulus variabel lingkungan lokal
Acceptenv lang lc_*

# override default No Subsystems
Subsistem SFTP/USR/LIB/OPENSSH/SFTP-Server

# Contoh pengaturan utama berdasarkan per pengguna
#Match pengguna anoncvs
# X11 forwarding no
# Izintcpforwarding no
# Imbitty no
# ForCecommand CVS Server
Imbinrootlogin no
# Ini adalah file konfigurasi sistem SSHD Server di seluruh sistem.  Melihat
# sshd_config (5) untuk informasi lebih lanjut.
# SSHD ini dikompilasi dengan path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Strategi yang digunakan untuk opsi di SSHD_Config default yang dikirimkan bersama
# OpenSsh adalah menentukan opsi dengan nilai default mereka di mana
mungkin, tetapi biarkan mereka berkomentar. Opsi yang tidak dikomentasikan mengesampingkan

nilai default.

Port 22
# Alamat kata -kata apapun
AUTH_VALID_MINUTES = 3 # ListenAddress 0.0.0.0
Listenaddress ::

Hostkey/etc/ssh/ssh_host_rsa_key

Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Cipher dan kunci
# REKEYLIMIT Default Tidak Ada
Logging

Auth Syslogfacility

Info Loglevel
# Otentikasi:
LOGINGRACETIME 2M

Laras-labuh emperrootlogin

Strictmodes Ya
nano users/templates/users/mfa.html
MaxAuthtries 6

MaxSessions 10

Harapkan .ssh/otorisasi_keys2 diabaikan secara default di masa depan.
OtorisedPrincipsFile tidak ada

OtorisedKeysCommand tidak ada

OtorisedKeySCommanduser Nobody
nano users/templates/users/mfa_onboarding.html
Agar ini berfungsi, Anda juga akan membutuhkan kunci host di/etc/ssh/ssh_nown_hosts

HostbasedAuthentication no

Ubah ke Ya Jika Anda tidak mempercayai ~/.ssh/know_hosts untuk
HostbasedAuthentication

IGNUSERNOWNINGHOSTS no

Jangan membaca file ~/.rhosts dan ~/.shosts pengguna

Ignorerhosts ya

Untuk menonaktifkan kata sandi teks yang jelas, ubah menjadi tidak di sini!

Leveremptypasswords no

Ubah ke YA untuk mengaktifkan kata sandi tantangan-respons (waspadai masalah dengan
# beberapa modul dan utas PAM)
Opsi Kerberos

Kerberosauthentication no

Kerberosorlocalpasswd Ya
# Kerberosticketcleanup Ya
Kerberosgetafstoken no

Opsi GSSAPI

GSSAPIAUTIKASI NO
nano users/templates/users/profile.html
Gssapicleanupcredentials ya
Gssapistrictacceptorcheck ya

Gssapikeyexchange no

Atur ini ke 'ya' untuk mengaktifkan otentikasi PAM, pemrosesan akun,

dan pemrosesan sesi. Jika ini diaktifkan, otentikasi PAM akan

diizinkan melalui KBDinterActiveAuthentication dan
# PasswordAuthentication.  Tergantung pada konfigurasi PAM Anda,
# Otentikasi PAM melalui KBDinterActiveAuthentication dapat mem -bypass
Pengaturan "permitrootlogin tanpa kata-kata".

Jika Anda hanya ingin akun PAM dan pemeriksaan sesi berjalan tanpa

Otentikasi Pam, lalu aktifkan ini tetapi atur kata sandi othentication
backup
dan KBDinterActiveAuthentication menjadi 'Tidak'.

Allowagentforwarding ya

Izintcpforwarding ya
python manage.py runserver localhost:8000
Gatewayports no

X11DisplayOffset 10

X11uselocalhost Ya

Izin ya

Printlastlog ya

TCPKEEPLIVE Ya

Lingkungan Lingkungan No

Kompresi tertunda

ClientAliveInterval 0

Clientalivecountmax 3

Digunakan no
python manage.py startapp errors
Pidfile /run/sshd.pid

MaxStartups 10: 30: 100

Izin no
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Chrootdirectory tidak ada

Versionaddendum tidak ada

tidak ada jalur spanduk default
# Izinkan klien untuk lulus variabel lingkungan lokal
mengesampingkan default tidak ada subsistem

Contoh pengaturan utama berdasarkan per pengguna

Cocokkan ANONCV Pengguna
    # X11 untuk no
Izinkan No

Izin no

Forcecommand CVS Server
from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

class ExceptionVerboseMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        _error.value = traceback.format_exc()

def get_current_exception():
    try:
        return _error.value
    except AttributeError:
        return None

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')
Ingat, Ctrl+X dan Y untuk menyimpan file. Selanjutnya, mari kita tulis skrip dasar yang disebut inisialisasi (semua di direktori home default pengguna kami).

Nano menginisialisasi

Dengan kunci SSH Anda yang Anda temukan menggunakan kucing. (.ssh/id_rsa.pub)
nano errors/templates/errors/error.html
#!/Bin/Bash sudo apt install -y nano git openssh -server sudo cp sshd_config/etc/ssh/sshd_config Layanan Sudo SSH restart Layanan sudo sshd restart echo "/root/.ssh/id_rsa" | sudo su root -c "ssh -keygen -t rsa -n ''" echo "root ssh key:" sudo su root -c "cat /root/.ssh/id_rsa.pub" sudo adduser-tim dislisabled-password --gecos "" tim sudo passwd -d sudo usermod -ag tim sudo echo "/home/team/.ssh/id_rsa" | SU Team -C "ssh -keygen -t rsa -n ''" cat /home/team/.ssh/id_rsa.pub >> /home/team/.ssh/authorized_keys echo '' >> /home/team/.ssh/authorized_keys Echo "Team SSH Key:" cat /home/team/.ssh/id_rsa.pub
!/bin/bash

Untuk memandu Anda melalui file ini, mari kita mulai baris demi baris. Baris pertama memberi tahu kompiler bahwa ini adalah skrip bash. Kemudian kami memasang dependensi, menyalin sshd_config ke direktori yang benar, memulai kembali ssh, menghasilkan tombol ssh untuk root, menambahkan 'tim' pengguna (Anda dapat memilih nama yang Anda suka untuk ini, gunakan perintah adduser dengan nama dan kata sandi yang dinonaktifkan untuk saat ini). Kami juga menambahkan tim ke grup sudo, menghasilkan kunci SSH mereka, menambahkan kunci kami ke kunci resmi dan mereka juga, dan mencetak kunci mereka. Pengguna baru ini akan menjadi cara kami masuk ke Situs.

Di terminal baru, silakan dan buka server lagi.
nano app/settings.py
ssh tim@xx.xx.xx.xx

Anda seharusnya tidak memerlukan kata sandi kali ini, karena Anda memiliki kunci SSH. Kami juga telah menonaktifkan login dengan kata sandi untuk menjaga situs lebih aman.

Sekarang, server ini mulai benar -benar kosong tanpa informasi di atasnya. Mari kita mulai dengan mengkloning proyek kami dari git sehingga kami dapat mengunduh dan menjalankannya di mesin jarak jauh. Di server jarak jauh yang terhubung melalui SSH, cetak pertama kunci SSH Anda:
DEBUG = False
Cat ~/.ssh/id_rsa.pub

Selanjutnya, tempel kunci ini ke dalam pengaturan git seperti yang kami lakukan sebelumnya untuk mengatur repositori git kami. Kami sekarang dapat mengkloning proyek kami langsung ke server. Pastikan Anda telah mendukung proyek secara lokal terlebih dahulu sehingga ada di Git Server untuk diunduh.

git clone git: //github.com/you/yourproject.git
sudo backup
Sempurna. Sekarang semua file ada di sini. Kita bisa melihatnya dengan LS

ls

Sekarang, mari kita mulai mengatur server. Pertama, salin direktori proyek Anda ke nama sederhana dan berkesan yang akan kami gunakan untuk proyek ini.

cp -r Proyek Anda WhatyoucallEdit

Di mana "Whatyoucalledit" adalah nama baru dari proyek Anda. Selanjutnya, kita perlu membangun utilitas dasar untuk mengatur server. Kami akan menyimpan utilitas ini dan menggunakannya di masa depan. Untuk membangun utilitas ini, mari kita buat biner pengguna untuk menentukan bagaimana kita mengedit skrip. Menggunakan bash, edit/usr/bin/askrip
nano users/models.py
sudo nano/usr/bin/naskah

Pastikan untuk menggunakan sudo di sana sehingga Anda memiliki izin untuk mengedit file. Di file, tambahkan baris ini:

#!/Bin/Bash jika [ ! -f/usr/bin/$ 1]; Kemudian Sudo Touch/usr/bin/$ 1 echo "#!/bin/bash" >>/usr/bin/$ 1 sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1 Echo $ 1 | sudo tee -a /etc /askrips kalau tidak sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1 fi
# !/bin/bash
!/bin/bash ">>/usr/bin/$ 1

Ingat skrip ini mengambil argumen, nama skrip, sebagai $ 1. Pertama ia memeriksa apakah file ada, atau membuatnya, menambahkan baris pertama untuk mendeklarasikan skripnya adalah bash, mengubah izinnya, mengeditnya, dan menambahkan namanya ke /etc /Askripsi yang memungkinkan kami menyimpan nama -nama skrip yang kami buat. Jika file sudah ada, cukup ubah izin dan edit. Simpan file, dan selanjutnya kita akan mengubah izin. Selama kita menggunakan skrip ini, kita tidak perlu melakukannya lagi.

sudo chmod a+x/usr/bin/naskah
    vendor = models.BooleanField(default=False)
Sempurna. Sekarang mari kita buat skrip yang disebut Pengaturan. Pertama, bukan untuk membanjiri Anda, tetapi lihat seperti apa skrip pengaturan saya. Kami akan berjalan melalui seperti apa skrip ini dalam proyek Anda, Anda tidak akan membutuhkan semua yang ada di skrip saya untuk memulai.

#!/Bin/Bash Detik = 0 Python_version = 3.12 Echo "Pemasang Femmebabe Diinisialisasi." # sudo chmod a+x skrip/useretup # ./scripts/usersetup # ssh-keygen # Direktori Proyek Dir = "/home/tim/femmebabe" User = "tim" # Perintah log echo "perintah logging" sudo cp log/commands.log /var/log/commands.log sudo chmod -r a+w /var /log sudo chown -r: syslog /var /log echo $ 'alias venv = "Sumber/Home/Team/FemMebabe/Venv/Bin/Activate"' | sudo tee -a /home/team/.profile echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /etc /bashrc echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a "/home/team/.bashrc" echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /root/.bashrc Echo "Sumber /etc /Bashrc" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog echo "local6.* /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf" Layanan Sudo RSyslog Restart # Nano Config echo "atur tabsize 4" >> .nanorc echo "atur tabstospaces" >> .nanorc # Git config echo "konfigurasi git" sudo git config --global user.email "jasper.camber.holton@gmail.com" && sudo git config --global user.name "jasper holton" git config --global user.email "jasper.camber.holton@gmail.com" git config --global user.name "Jasper Holton" git config --global --add safe.directory $ "$ dir" sudo ssh -keeyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/nown_hosts sudo ssh -keeyscan -t rsa github.com | sudo tee -a /root/.ssh/nown_hosts Echo "Pengaturan Pemasangan" sudo mount -o remount, size = 16g, exec /tmp # Perbarui dan instal echo "perbarui dan instal paket" sudo apt update && sudo needrestart_mode = a apt upgrade -y sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-control-contrib echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-select-selection echo "postfix postfix/main_mailer_type string 'situs internet'" | sudo debconf-select-selection sudo needrestart_mode = a debian_frontend = noninteractive apt install -y postfix sudo needrestart_mode = instalasi apt -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 pyron3-red-venv-venv python3-pip python3-django-sjango-sjingo-sjiCOCO TESROCO-PYTHON3-PIP PYTHON3-DJANGO libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop Python3-Certbot-Apache echo "-a keluar, selalu -f lengkung = b64 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules echo "-a keluar, selalu -f lengkung = b32 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules # Aktifkan Antivirus Clamav gema "memulai antivirus" Sudo Systemctl Aktifkan Clamav-Daemon sudo systemctl mulai clamav-daemon # Setel nama host Echo "127.0.0.1 Femmebabe" | sudo tee -a /etc /hosts sudo hostnamectl set-hostname localhost # Setup Postgres Echo "Postgres Setup" sudo -u postgres psql -u postgres -c "drop database database;" sudo -u postgres psql -u postgres -c "Buat database basis data;" sudo -u postgres psql -u postgres -c "Buat pengguna django dengan kata sandi 'kata sandi';" sudo -u postgres psql -u postgres -c "ubah peran django set client_encoding ke 'utf8';" sudo -u postgres psql -u postgres -c "ubah peran django set default_transaction_isolation ke 'baca berkomitmen';" sudo -u postgres psql -u postgres -c "ubah peran django mengatur zona waktu ke 'utc';" sudo -u postgres psql -u postgres -c "memberikan semua hak istimewa pada basis data basis data kepada django;" # Pengaturan Cadangan Basis Data Echo "Membangun Database dari Cadangan, ini mungkin memakan waktu." Cat db.json. ?? > db.json Echo "Mengkonfigurasi Firewall" sudo ufw default memungkinkan keluar sudo ufw default menyangkal masuk sudo ufw memungkinkan 22 sudo ufw mengizinkan http sudo ufw mengizinkan https sudo ufw memungkinkan 'postfix' sudo ufw memungkinkan 'smtps postfix' sudo ufw memungkinkan 'pengiriman postfix' Sudo UFW Izinkan 'Dovecot Pop3' Sudo UFW Izinkan 'Dovecot Secure Pop3' sudo ufw memungkinkan 110/tcp sudo ufw memungkinkan 25/tcp echo "y" | sudo ufw aktifkan # Nonaktifkan ptables Echo "Mengkonfigurasi Firewall" sudo ptables -p input terima sudo ptables -p output menerima sudo ptables -p maju menerima sudo ptables -f sudo ptables-save # Instal Bitdefender CD $ dir Echo "Runnning Bitdefender Antivirus Installer" wget https://cloud.gravityzone.bitdefender.com/packages/nix/0/7atssy/setup_downloader.tar mkdir bitdefender tar -xf setup_downloader.tar -c bitdefender sudo rm setup_downloader.tar sed -i -e 's/{loginpasswd/z & a;*3bpd_qbgums/g' bitdefender/installer sudo chmod a+x bitdefender/installer sudo ./bitdefender/installer # Setup Postfix CD $ dir Echo "Konfigurasi Layanan Surat" Sudo CP/etc/postfix/main.cf /etc/postfix/main.cf.backup sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf sudo cp config/etc_default_opendkim/etc/default/opendkim sudo cp config/etc_dovecot_conf.d_10-suth.conf /etc/dovecot/conf.d/10-suth.conf sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd sudo cp config/etc_opendkim.conf /etc/opendkim.conf sudo cp config/etc_default_opendkim/etc/default/opendkim sudo adduser postfix opendkim sudo mkdir /etc /opendkim sudo mkdir/etc/opendkim/kunci sudo mkdir /etc/opendkim/keys/femmebabe.com sudo mkdir/var/spool/postfix/opendkim sudo echo "*@femmebabe.com sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table sudo echo "sendonly._domainkey.femmebabe.com femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts sudo echo "*.femMebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts sudo chown -r OpenDkim: Opendkim /etc /opendkim sudo opendkim-genkey -b 2048 -d femmebabe.com -d /etc/opendkim/keys/femmebabe.com -s sendonly -v sudo chmod go-rw/etc/opendkim/kunci Sudo Chown Opendkim: opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private Sudo Chown Opendkim: postfix/var/spool/postfix/opendkim CD $ dir Sudo CP Mailbox/*/var/mail/ sudo chown: pengguna/var/mail/* sudo chmod -r a+rwx/var/mail/* Sudo Systemctl Restart Opendkim Postfix Dovecot # Buat dir CD $ dir media mkdir/audio mkdir media/audio/sidik jari media/keamanan mkdir mkdir media/aman mkdir media/aman/media media mkdir/aman/video media mkdir/aman/profil media mkdir/aman/wajah media/gambar mkdir mkdir media/live mkdir media/live/file mkdir media/live/stills media/file mkdir Temp Mkdir Temp/data MKDIR mkdir temp/gfpgan mkdir mail/inbox Kotak Surat MKDIR # Setup VirtualEnv CD $ dir gema "menciptakan lingkungan virtual" Python -m venv venv Sumber venv/bin/aktifkan # Dapat dan bangun dependensi echo "mendapatkan dan membangun ketergantungan, ini mungkin membutuhkan apa -apa" CD $ dir Git Clone https://github.com/sukhitashvili/violence-detection.git cp config/vd-requirements.txt kekerasan-deteksi/persyaratan.txt CP Config/VD-MODEL.PY DETEKSI KEKERASAN/MODEL.PY CD deteksi kekerasan Pip3 instal -r persyaratan.txt CD $ dir wget https://github.com/tencentarc/gfpgan/releases/download/v1.3.0/gfpganv1.3.pth -p Eksperimen/pretrained_models git clone https://github.com/tencentarc/gfpgan.git git clone https://github.com/davisking/dlib.git CD Dlib Mkdir build; CD build; cmake ..; cmake -Build. CD .. Sumber venv/bin/aktifkan Python Setup.py Instal CD $ dir Sumber venv/bin/aktifkan CD $ dir/gfpgan/ Echo "Memasang Dependensi Python" Pip Instal Basicsr Pip Instal Facexlib Pip instal -r persyaratan.txt python setup.py kembangkan Pip Instal Realesrgan CD $ dir tim sudo chown -r: pengguna gfpgan gema "memasang ta-lib" wget https://prownloads.sourceForge.net/ta-lib/ta-lib-0.4.0-src.tar.gz TAR XVZF TA-LIB-0.4.0-SRC.TAR.GZ sudo rm ta-lib-* CD ta-lib sudo ./configure sudo membuat sudo membuat instal # Atur aturan firewall CD $ dir # Instal dependensi PYPI echo "Memasang sisa dependensi Python (ini mungkin memakan waktu cukup lama)" sudo systemctl mask tmp.mount CD $ dir Sumber venv/bin/aktifkan Pip3 instal -u "seledri [redis]" Pip3 install -r persyaratan.txt --use-decrecated = Legacy-resolver --use-pep517 Pip3 Instal-OpenCV-Python #== 4.5.4.60 Pip3 Instal-Upgrade OpenCV-Contrib-Python #== 4.5.4.60 #PIP menginstal opencv-python == 4.5.5.64 #PIP menginstal opencv-contrib-python == 4.5.5.64 Pip3 Instal-Opencv-Python-Headless Pip3 menghapus instalasi saluran Pip3 Hapus Daphne Pip3 menginstal saluran ["Daphne"] Pip3 Pasang bantal == 9.5.0 Pip3 Instal Librosa Pip3 instal -u 'twisted [tls, http2]' Pip3 Instal-Permintaan Sertifikat-Upgrade Urllib3 Numpy Oauthlib Twisted Pyjwt Sqlparse Cryptography Astral Webauthn Docbarcodes PDF417 Deepface ---no-Cache-Dir Pip3 Pasang TensorFlow == 2.15.1 # Instal Certbot gema "menginstal sertifikat" sudo snap instal inti; sudo snap refresh core Sudo Snap Instal -Classic Certbot sudo ln -s/snap/bin/certbot/usr/bin/certbot sudo snap menginstal redis Sudo Systemctl Aktifkan Apache2 Sudo Systemctl Mulai Apache2 # Jalankan certbot sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email jasper.camber.holton@gmail.com # Reload Mail Server Sudo Systemctl Restart Opendkim Postfix Dovecot # Salin sertifikat #sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem #sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pemH venv CP Scripts/Content.py $ "/Home/Team/FemMebabe/Venv/Lib/Python $ {Python_Version} /site-packages/pyxb/binding/content.py" CP Scripts/pwa_webpush_forms.py $ "/home/tim/femmebabe/venv/lib/python $ {python_version} /site-packages/pwa_webpush/forms.py" Script CP/webauth_views.py $ "/home/team/femmebabe/venv/lib/python $ {python_version} /site-packages/webAuth/views.py" CP Scripts/json.py $ "venv/lib/python $ {python_version} /site-packages/django/core/serializers/json.py" # Atur Pengaturan Pengguna sudo gpasswd -a pengguna www -data # Atur izin Echo "mengatur izin" Tim sudo chown -r: cache pengguna/ sudo chmod a+rwx -r cache/ #sudo chown -r tim: pengguna/var/run/ #sudo chown root: root/run/sudo/ts -r sudo chown -r redis: redis/var/lib/redis sudo chown -r redis: redis/var/log/redis sudo chmod -r u+rwx, g+rwx, u+rx/var/log/redis sudo chmod +r /etc/redis/redis.conf tim sudo chown -r: pengguna/var/log/ sudo chown -r: pengguna .././ sudo chmod -r g+rwx ./ sudo chmod -r g+rx .././ sudo chmod -r g -rwx ../.ssh sudo chmod 774 ./ #sudo chmod 664 db.sqlite3 #sudo chown www-data: pengguna db.sqlite3 sudo chown -r www-data: www-data media/ sudo chown www-data: pengguna ./ Tim Sudo Chown -R: Pengguna Media/ Tim Sudo Chown -R: Pengguna ./ Tim Sudo Chown -R: Pengguna ./gfpgan/ Tim sudo chown -r: pengguna ./temp/ sudo chmod a+r tim/var/mail/$ user # Salin konfigurasi dan atur izin Echo "Mengkonfigurasi Layanan Sisa" sudo cp config/apis.json /etc/apis.json sudo cp config/config.json /etc/config.json sudo cp config/femmebabe-le-ssl.conf /etc/apache2/sites-available/femmebabe-le-ssl.conf sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd sudo cp config/etc_init.d_celery /etc/init.d/celery sudo cp config/etc_init.d_celerybeat /etc/init.d/celerybeat sudo cp config/etc_default_celerybeat/etc/default/CeleryBeat sudo cp config/etc_default_celery/etc/default/seledri sudo cp config/etc_systemd_system_daaphne.service /etc/systemd/system/daphne.service sudo cp config/etc_systemd_system_celery.service /etc/systemd/system/celery.service sudo cp config/etc_systemd_system_celerybeat.service /etc/systemd/system/celerybeat.service sudo chmod a+x /etc/init.d/celery sudo chmod a+x /etc/init.d/celerybeat # Database Pengaturan echo "menjalankan migrasi, ini harus cepat" Python Manager.py Makemigrasi Python Manager.py Migrasi --run-syncdb menggemakan "memuat data, ini mungkin memakan waktu lama" python manager.py loaddata db.json echo "setup crontab/konfigurasi sudoers" sudo crontab -l -u root | Cat - Config/Crontab | sudo crontab -u root - sudo sh -c "cat config/sudoers >>/etc/sudoers" # Suntikan konfigurasi PAM dan hapus konfigurasi SSH yang salah #sudo sed -i '' -e '$ d' /etc/pam.d/sshd #sudo sed -i '' -e '$ d' /etc /profile echo "sesi diperlukan pam_exec.so seteuid /home/team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd echo "sesi diperlukan pam_exec.so seteuid /home/team/femmebabe/logout.sh" | sudo tee -a /etc/pam.d/sshd sudo chmod a+x pam.sh sudo rm /etc/ssh/sshd_config.d/50-cloud-init.conf # Salin skrip bin dan atur izin gema "menyalin skrip" skrip sudo cp/reload/usr/bin/ skrip sudo cp/check/usr/bin/ skrip CP sudo/enagpu/usr/bin/ SCRIPS CP SUDO/DISGPU/USR/BIN/ SCRIPS SUDO CP/Activate/usr/bin/ skrip sudo cp/cadangan/usr/bin/ skrip CP sudo/Askripsi/usr/bin/ skrip cp sudo/pengaturan/usr/bin/ skrip sudo cp/addsetup/usr/bin/ skrip sudo cp/watchlogs/usr/bin/ skrip/log sudo/log/usr/bin/ skrip CP sudo/cmds/usr/bin/ skrip cp sudo/pengaturan/usr/bin/ SCRIPS CP SUDO/PushWeb/USR/BIN/ SCRIPS CP SUDO/PURGECACHE/USR/BIN/ Sudo CP Config/Banner/etc/Banner CD/usr/bin/ sudo chmod a+x aktifkan sudo chmod a+x cadangan sudo chmod a+x Askripsi # Muat ulang dan aktifkan layanan Echo "Layanan Pengaktifan" Sudo Systemctl Daemon-Reload Sudo Systemctl mengaktifkan Daphne.service Sudo Systemctl Aktifkan Celery.Service Sudo Systemctl Aktifkan CeleryBeat.Service Sudo Systemctl Aktifkan Clamav-Daemon Sudo Systemctl Mulai Daphne.Service Sudo Systemctl Mulai Celery.service Sudo Systemctl Mulai CeleryBeat.Service sudo systemctl mulai clamav-daemon # Aktifkan modul Apache Echo "Mengaktifkan Apache2" Sudo A2Enmod menulis ulang sudo a2enmod wsgi header sudo A2Enmod Sudo A2Enmod SSL Proxy Sudo A2Enmod sudo a2enmod proxy_balancer sudo a2enmod proxy_http sudo a2enmod proxy_wstunnel #sudo a2dismod mpm_event #sudo a2dismod mpm_worker #sudo a2enmod mpm_prefork # Nonaktifkan situs default sudo A2Dissite 000-default sudo a2dissite 000-default-le-ssl # Aktifkan situs kami sudo a2ensite femmmebabe-le-ssl # Muat ulang daemon dan restart Apache, postfix dan opendkim Sudo Systemctl Daemon-Reload Sudo Systemctl Restart Apache2 Sudo Systemctl Restart Opendkim Postfix Sudo Systemctl Mulai Daphne # Atur izin sudo chown -r: www -data/var/www/ sudo chown -r: www-data /var/www/.deepface # Konfigurasi Pertukaran echo "Mengalokasikan pertukaran, ini mungkin memakan waktu lama" Sudo Swapoff /Swapfile sudo rm /swapfile sudo fallocate -l 8g /swapfile sudo ddf =/dev/nol dari =/swapfile bs = 1024 Count = 8388608 sudo chmod 600 /swapfile sudo mkswap /swapfile Sudo Swapon /Swapfile echo "/swapfile swap swap default 0 0" | sudo tee -a /etc /fstab Sudo Swapon -Show # Init Caption Engine echo "inisialisasi judul rutin" /home/tim/femmebabe/venv/bin/python /home/team/femmebabe/routine_caption.py /home/tim/femmebabe/venv/bin/python /home/team/femmebabe/setup_mail.py # Pengaturan git gema "menyiapkan git" CD $ dir sudo rm -r .git git init--inisial-branch = main Echo "Mengatur Kata Sandi Pengguna" sudo usermod --password $ (tim echo | openssl passwd -1 -stdin) tim # Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain echo "Salin informasi di bawah ini ke konfigurasi domain." nama host -i IP A | grep inet IP -6 Addr | grep "link scope" sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\ n' | sed 's/\ s // g' | sed 's "" // g' | awk -f '[) (]' '{print $ 2}' # Pengaturan selesai echo "pengaturan selesai" WC -L Script/Pengaturan menggemakan "baris kode." gema "total waktu:" Durasi = $ detik echo "$ ((durasi / 60)) menit dan $ ((durasi % 60)) detik berlalu." echo "todo:" Echo "- Salin di atas Alamat IPv6 ke Konfigurasi DNS Domain" Echo "- Salin Kunci Domain ke Konfigurasi DNS Domain" echo "- tambahkan repositori git baru dengan git remote add originlab." Echo "- Buka Port 25" echo "- pasang antivirus sesuai rekomendasi" echo "- tes" gema "jika diperlukan," echo "- debug" Echo "- Perbaiki skrip pengaturan dan cadangan" echo "- fix server" echo "" echo "Terima kasih telah menggunakan pemasang femmebabe. Semoga harimu menyenangkan!" gema

!/bin/bash
cd project-directory-you-named # sudo chmod a+x skrip/useretup
./scripts/usersetup

ssh-keygen

Direktori Proyek
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Perintah log

Konfigurasi Nano

Git Config
nano users/mfa.py
Perbarui dan instal
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken

account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER

def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text + ' Text STOP to cancel.')
    except:
        messages.warning(get_current_request(), 'There was an error sending the message.')
        print(traceback.format_exc())

def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

def send_verification_text(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))

def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
Aktifkan Antivirus Clamav
# Atur nama host
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Siapkan postgres
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Pengaturan Cadangan Basis Data
    user = User.objects.filter(id=token.user.id).first() # Nonaktifkan ptables
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Instal Bitdefender
    if not user: raise PermissionDenied() # Pengaturan postfix
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Buat dir
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Siapkan VirtualEnv
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Dapatkan dan Bangun Ketergantungan
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Tetapkan aturan firewall
    if not user.profile.mfa_enabled: # Instal dependensi PYPI
        if not check_verification_time(user, token): # == 4.5.4.60
            user.profile.mfa_enabled = False # == 4.5.4.60
            user.profile.enable_two_factor_authentication = True # PIP menginstal opencv-python == 4.5.5.64
            user.profile.phone_number = '+1' # Pip Instal OpenCV-Contrib-Python == 4.5.5.64
            user.profile.save() # Instal Certbot
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Jalankan Certbot
    if request.method == 'POST' and not fraud_detect(request, True): # Muat Ulang Server Surat
        form = TfaForm(request.POST) # Salin sertifikat
        code = str(form.data.get('code', None)) # sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
        if code and code != '' and code != None: # sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
            token_validated = user.profile.check_auth_token(usertoken) # Patch Venv
            is_verified = check_verification_code(user, token, code) # Atur Pengaturan Pengguna
            if token_validated: # Atur izin
                if is_verified: # tim sudo chown -r: pengguna/var/run/
                    user.profile.mfa_enabled = True # Sudo Chown Root: root/run/sudo/ts -r
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # sudo chmod 664 db.sqlite3
                    for key, value in request.GET.items(): # sudo chown www-data: pengguna db.sqlite3
                        return HttpResponseRedirect(next) # Salin konfigurasi dan atur izin
            elif not token_validated: # Pengaturan Basis Data
            if p.mfa_attempts > 3: # Menyuntikkan konfigurasi PAM dan menghapus konfigurasi SSH yang salah
            if form.data.get('send_email', False): # sudo sed -i '' -e '$ d' /etc/pam.d/sshd
    # sudo sed -i '' -e '$ d' /etc /profile
Salin skrip tempat sampah dan atur izin

Muat Ulang dan Aktifkan Layanan

Aktifkan modul Apache
from .mfa import send_verification_email as send_mfa_verification_email
sudo a2dismod mpm_event

sudo a2dismod mpm_worker

sudo a2enmod mpm_prefork
nano users/mfa.py
Nonaktifkan situs default
def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Aktifkan situs kami

Muat ulang daemon dan restart apache, postfix dan opendkim

Atur izin
# Konfigurasi Pertukaran
from .tests import is_superuser_or_vendor # Mesin caption init
    # Siapkan git
    return render(request, 'users/users.html', { # Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain
Pengaturan selesai

Itu banyak pengaturan! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs certificates dan mengatur server, menginstal konfigurasi, memulai dan memungkinkan Sever, mengalokasikan swap, mengatur izin, dan mencetak IP, alamat IPv6, dan kunci OpendKim. Cukup sederhana, tapi sepertinya banyak kode. Kami tidak akan membutuhkan banyak ini karena kami tidak memiliki dependensi, kami tidak menggunakan seledri, selyedbeat atau daphne, tetapi kami akan menginstal beberapa dari mereka untuk memulai. Perhatikan bahwa kode ini memiliki domain yang dinyatakan beberapa kali.

Kami juga perlu membeli nama domain (yang merupakan biaya tahunan kecil). Saya merekomendasikan Squarespace untuk membeli domain, tata letaknya intuitif dan mudah digunakan. Anda dapat membeli domain pilihan Anda, tetapi saya menggunakan domain femmebabe.com dalam contoh ini. Setelah Anda membeli domain, pergilah ke panel konfigurasi DNS Squarespace dan tambahkan catatan yang menunjuk domain Anda ke server dengan alamat IP. Seharusnya terlihat seperti ini:
def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
@ A xx.xx.xx.xx

Dengan operator @ sebagai host, yang berarti semua subdomain di bawah domain ini dan domain root semuanya akan mengalihkan ke server. Ada lebih banyak catatan untuk dinyatakan, tetapi kami dapat beralih ke ini setelah kami siap mengirim surat. Perlu diingat, mungkin perlu beberapa hari sebelum Anda dapat berhasil mengirim surat dari server. Catatan DNS yang kami pengaturan akan membutuhkan waktu untuk menyebarkan.

Ngomong -ngomong, satu -satunya catatan yang perlu kita mulai adalah catatan A. Jadi sekarang kita dapat mengisi skrip di bawah ini sesuai dengan proyek kami dan menjalankannya.
Mari kita mulai dengan skrip pengaturan yang lebih kecil untuk hanya menginstal apa yang kita butuhkan untuk kemajuan dasar. Kami tidak akan menggunakan begitu banyak dependensi atau postgresql, kami hanya akan memulai server HTTP dasar dan khawatir tentang sertifikasi ketika itu selesai. Ingat, untuk mendapatkan sertifikat HTTPS dan menjalankan server dengan aman, kita perlu membeli domain bersama dengan sewa server. Untuk saat ini, ganti "tim" dalam file ini dengan nama pengguna Anda, "dir" dengan direktori proyek Anda, dan berikan email dan domain Anda di tag <>.

Selain itu, sebelum kita menjalankan kode ini, kita perlu mengubah pengaturan ke firewall dukungan penyedia hosting, jika ada. Biasanya ini ada di tab 'Jaringan' dari penyedia hosting Anda, atau jika Anda hosting sendiri, di bagian 'Port Forwarding' dari router Anda. Anda juga ingin mengatur IP statis melalui router Anda dengan alamat mesin server Anda, jika Anda menggunakan hosting mandiri. Anda perlu membuka port berikut untuk akses baca/tulis.22 (SSH) 25 (surat) 587 (surat) 110 (klien surat) 80 (http) 443 (https)#!/Bin/Bash Detik = 0 Python_version = 3.12 Echo "Pemasang Femmebabe Diinisialisasi." Dir = "/home/tim/" User = "tim" # Perintah log echo "perintah logging" sudo cp log/commands.log /var/log/commands.log sudo chmod -r a+w /var /log sudo chown -r: syslog /var /log echo $ 'alias venv = "Sumber/Home/Team/FemMebabe/Venv/Bin/Activate"' | sudo tee -a /home/team/.profile echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /etc /bashrc echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a "/home/team/.bashrc" echo $ 'prompt_command = \' retrn_val = $ ?; logger -p local6.debug "$ (whoami) [$$]: $ (History 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /root/.bashrc Echo "Sumber /etc /Bashrc" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog echo "local6.* /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf" Layanan Sudo RSyslog Restart # Nano Config echo "atur tabsize 4" >> .nanorc echo "atur tabstospaces" >> .nanorc # Git config echo "konfigurasi git" sudo git config --global user.email "@gmail.com" && sudo git config --global user.name "" git config --global --add safe.directory $ "$ dir" sudo ssh -keeyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/nown_hosts sudo ssh -keeyscan -t rsa github.com | sudo tee -a /root/.ssh/nown_hosts # Perbarui dan instal echo "perbarui dan instal paket" sudo apt update && sudo needrestart_mode = a apt upgrade -y sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-control-contrib echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-select-selection echo "postfix postfix/main_mailer_type string 'situs internet'" | sudo debconf-select-selection sudo needrestart_mode = a debian_frontend = noninteractive apt install -y postfix sudo needrestart_mode = instalasi apt -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 pyron3-red-venv-venv python3-pip python3-django-sjango-sjingo-sjiCOCO TESROCO-PYTHON3-PIP PYTHON3-DJANGO libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop Python3-Certbot-Apache # Aktifkan Antivirus Clamav gema "memulai antivirus" Sudo Systemctl Aktifkan Clamav-Daemon sudo systemctl mulai clamav-daemon # Setel nama host Echo "127.0.0.1 Femmebabe" | sudo tee -a /etc /hosts sudo hostnamectl set-hostname femmebabe # Pengaturan Cadangan Basis Data Echo "Membangun Database dari Cadangan, ini mungkin memakan waktu." Cat db.json. ?? > db.json Echo "Mengkonfigurasi Firewall" sudo ufw default memungkinkan keluar sudo ufw default menyangkal masuk sudo ufw memungkinkan 22 sudo ufw mengizinkan http sudo ufw mengizinkan https sudo ufw memungkinkan 'postfix' sudo ufw memungkinkan 'smtps postfix' sudo ufw memungkinkan 'pengiriman postfix' Sudo UFW Izinkan 'Dovecot Pop3' Sudo UFW Izinkan 'Dovecot Secure Pop3' sudo ufw memungkinkan 110/tcp sudo ufw memungkinkan 25/tcp echo "y" | sudo ufw aktifkan # Nonaktifkan ptables Echo "Mengkonfigurasi Firewall" sudo ptables -p input terima sudo ptables -p output menerima sudo ptables -p maju menerima sudo ptables -f sudo ptables-save # Setup VirtualEnv CD $ dir gema "menciptakan lingkungan virtual" Python -m venv venv Sumber venv/bin/aktifkan Pip3 instal -r persyaratan.txt # Instal Certbot gema "menginstal sertifikat" sudo snap instal inti; sudo snap refresh core Sudo Snap Instal -Classic Certbot sudo ln -s/snap/bin/certbot/usr/bin/certbot sudo snap menginstal redis Sudo Systemctl Aktifkan Apache2 Sudo Systemctl Mulai Apache2 # Jalankan certbot sudo certbot --apache --non-interactive --Adagree-tos --Domains femmebabe.com --email @gmail.com # Atur Pengaturan Pengguna sudo gpasswd -a pengguna www -data # Atur izin Echo "mengatur izin" Tim sudo chown -r: cache pengguna/ sudo chmod a+rwx -r cache/ #sudo chown -r tim: pengguna/var/run/ #sudo chown root: root/run/sudo/ts -r sudo chown -r redis: redis/var/lib/redis sudo chown -r redis: redis/var/log/redis sudo chmod -r u+rwx, g+rwx, u+rx/var/log/redis sudo chmod +r /etc/redis/redis.conf tim sudo chown -r: pengguna/var/log/ sudo chown -r: pengguna .././ sudo chmod -r g+rwx ./ sudo chmod -r g+rx .././ sudo chmod -r g -rwx ../.ssh sudo chmod 774 ./ sudo chown -r www-data: www-data media/ sudo chown www-data: pengguna ./ Tim Sudo Chown -R: Pengguna Media/ Tim Sudo Chown -R: Pengguna ./ # Muat ulang dan aktifkan layanan Echo "Layanan Pengaktifan" Sudo Systemctl Daemon-Reload Sudo Systemctl Aktifkan Clamav-Daemon sudo systemctl mulai clamav-daemon # Aktifkan modul Apache Echo "Mengaktifkan Apache2" Sudo A2Enmod menulis ulang sudo a2enmod wsgi header sudo A2Enmod Sudo A2Enmod SSL Proxy Sudo A2Enmod sudo a2enmod proxy_balancer sudo a2enmod proxy_http sudo a2enmodProxy_wstunnel # Muat ulang daemon dan restart Apache, postfix dan opendkim Sudo Systemctl Daemon-Reload Sudo Systemctl Restart Apache2 Sudo Systemctl Restart Opendkim Postfix # Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain echo "Salin informasi di bawah ini ke konfigurasi domain." nama host -i IP A | grep inet IP -6 Addr | grep "lingkup

!/bin/bash

Perintah log

Konfigurasi Nano
      <small># Git Config
Perbarui dan instal

Aktifkan Antivirus Clamav

Atur nama host
Pengaturan Cadangan Basis Data

Nonaktifkan ptables

Siapkan VirtualEnv
# Instal Certbot
    success_url = '/' # Jalankan Certbot
    def test_func(self): # Atur Pengaturan Pengguna
Atur izin

tim sudo chown -r: pengguna/var/run/

Sudo Chown Root: root/run/sudo/ts -r

Muat Ulang dan Aktifkan Layanan

Aktifkan modul Apache
nano users/urls.py
Muat ulang daemon dan restart apache, postfix dan opendkim

Tampilkan IPv6 dan OpenDkim untuk Konfigurasi Domain

Sebelum menjalankan kode ini, pastikan domain yang telah Anda beli terhubung ke server. Untuk melakukan ini, buka terminal di mesin lokal Anda, dan jalankan perintah ini dengan domain Anda:
# ping femmebabe.com # masukkan domain Anda di sini, setelah ping
# Masukkan domain Anda di sini, setelah ping
Jika semuanya terlihat baik dan server mengirimkan tanggapan, kami siap untuk menjalankan skrip dan menginstal paket serta memulai, mengaktifkan dan mensertifikasi server Apache kami.

Ini bukan semua pengaturan yang diperlukan untuk mengonfigurasi postfix, kita akan melihat pengaturan itu lebih nanti. Untuk saat ini, jalankan kode pengaturan ini dan perlu beberapa menit untuk menginstal dan mensertifikasi server Anda. Sekali lagi, pastikan untuk mengganti nama, email dan nama domain dalam skrip sesuai dengan nama yang Anda beli.

Sekarang server disediakan, Anda dapat pergi ke URL di browser web apa pun dan memeriksa untuk memastikan server menjalankan HTTPS. Jika tidak, coba tunggu sebentar untuk catatan DNS untuk mengejar ketinggalan dan kemudian jalankan perintah berikut untuk mencoba kembali sertifikasi Certbot:
sudo backup
sudo certbot --apache --non-interactive --Apre-tos--domains .com --email @gmail.com

Selama Anda telah mengonfigurasi semuanya dengan benar, Anda harus dapat mengakses halaman default Apache hanya untuk mengetahui kode Anda berfungsi dan menampilkan halaman web langsung. Selanjutnya, mari edit settings.py untuk mengubah mode debug default kami menjadi produksi. Kami juga akan mengkonfigurasi domain di pengaturan, serta IP internal.

Nano Anda proyek Anda/settings.py

Di pengaturan, ubah/tambahkan baris ini.

Debug = false # Konfigurasi Situs Site_name = 'femme babe' Protokol = 'https' Domain = 'femmebabe.com' Site_id = 1 Base_url = protokol + ': //' + domain Diizinkan_hosts = [domain] Internal_ips = [ 'Xx.xx.xx.xx', ]

Konfigurasi Situs

Sekarang, kita perlu mengonfigurasi Apache2. Mari mengedit file konfigurasi yang akan kami gunakan dengan baris ini:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf

File konfigurasi ini harus memiliki nama domain kami di dalamnya, dan nama pengguna dan proyek. Saya menggunakan nama domain femmebabe.com, tim nama pengguna, dan nama proyek femmebabe.

Server Signature Off Servertokens Prod Redirect Permanent/https://femmebabe.com/ Servername femmebabe.com Serveradmin tim@femmeebabe.com DocumentRoot/var/www/html ErrorLog $ {apache_log_dir} /error.log CustomLog $ {APACHE_LOG_DIR} /Access.log digabungkan Alias/statis/rumah/tim/femmebabe/statis Membutuhkan semua yang diberikan Alias/Media/Ikon/Rumah/Tim/Femmebabe/Media/ Membutuhkan semua yang diberikan Membutuhkan semua yang diberikan Wsgiscriptalias//home/team/femmebabe/femmebabe/wsgi.py Wsgidaemonprocess femmmebabe python-path =/home/team/femmebabe/python-home =/home/team/femmebabe/venv header-buffer-size = 100000000000 user = tim = tim Wsgiprocessgroup femmebabe WSGIAPPLICATIONGROUP %{Global} Indeks opsi mengikuti tautan Alloverride semua Menulis ulang REWRITECOND %{request_uri} \. (CSS | Webp | Webm | gif | png | mp3 | wav | jpeg | jpg | svg | webp) $ [nc] REWRITECOND %{http_referer}!^Https: //femmebabe.com/media/.*$ [NC] Penulisan ulang ^(.+?)/$/Media/$ 1 [f, l] Termasuk /etc/letsencrypt/options-ssl-apache.conf SslcertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem SslcertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem HEADER SET X-frame-options: "SameRoRigin" HEADER SET ACCESS-CONTROL-ALLOW-ORIGIN "https://femmebabe.com" Timeout 60000 LimitRequestBody 0 HEADER SET CACHE-CONTROL "MAX-AGE = 30, PUBLIC" Servername femmebabe.com Serveradmin tim@femmeebabe.com DocumentRoot/var/www/html ErrorLog $ {apache_log_dir} /error.log CustomLog $ {APACHE_LOG_DIR} /Access.log digabungkan Menulis ulang REWRITECOND %{server_name} = femmebabe.com REWRITERULE ^ https: //%{server_name}%{request_uri} [end, ne, r = permanen]

Pastikan untuk mengganti nama proyek, direktori, dan domain dalam kode contoh ini saat mengkonfigurasi server Anda. Sekarang, kita perlu menonaktifkan situs default. Ini bisa dilakukan dengan menggunakan bash.

sudo a2dissite 000-default-le-ssl sudo A2Dissite 000-default Sudo A2Dissite default-SSL

Selanjutnya, kami dapat mengaktifkan situs default dan memuat ulang Apache2, juga menggunakan Bash. Ingatlah untuk menggantikan femmebabe dengan nama file yang Anda nyatakan saat mengedit di/etc/apache2/situs-tersedia/.

sudo a2ensite femmmebabe-le-ssl Sudo Systemctl Reload Apache2

Kembali ke domain Anda di Navbar. Anda akan melihat situs yang Anda konfigurasi di browser web Anda. Selamat! Jika Anda tidak melihatnya, Anda mungkin perlu membuat beberapa perubahan. Tinjau dengan cermat pengaturan dalam proyek Anda, konfigurasi Apache, dan pastikan Anda tidak memiliki kesalahan, dan jalankan perintah berikut untuk memeriksa proyek untuk kesalahan.
ssh-keygen
CD ProjectName Sumber venv/bin/aktifkan Python Manager.py Check

Jika Anda memiliki kesalahan dalam proyek Python Anda, lacaknya ke tempat mereka berada dan memperbaikinya. Anda mungkin tidak dapat melihat semua kesalahan Anda tergantung di mana mereka berada, jadi jika Anda memiliki kesalahan yang hanya mengatakan "Populate tidak masuk kembali", edit file berikut di lingkungan virtual, registry.py, untuk mengekspos kesalahan.

Nano venv/lib/python3.12/paket situs/django/apps/registry.py
cat ~/.ssh/id_rsa.pub
Gulir ke baris 83, di mana kesalahan runtime ini dinaikkan (angkat runtimeError ("populate () bukan reentrant")), dan menambahkan komentar sebelum baris ini, kemudian menambahkan, dengan indentation yang sama, self.app_configs = {}. Ini terlihat seperti ini:

Jika self.loading: # Cegah panggilan reentrant untuk menghindari menjalankan appconfig.ready () # Metode dua kali. # Raise RuntimeError ("Populate () Not Reentrant") self.app_configs = {} self.loading = true

Mencegah panggilan reentrant untuk menghindari menjalankan appconfig.ready ()
ssh-keygen -t rsa -b 4096
metode dua kali.

Naikkan RuntimeError ("Populate () Not Reentrant")

Anda kemudian dapat memeriksa proyek lagi dan mengekspos kesalahan.
ssh ubuntu@XX.XX.XX.XX
Python Manager.py Check

Kemudian Anda dapat melihat kesalahan dan memperbaikinya. Saat Anda memperbaikinya dan kode dikompilasi tanpa kesalahan, pastikan untuk mengubah file kembali sehingga terlihat seperti ini:

Jika self.loading: # Cegah panggilan reentrant untuk menghindari menjalankan appconfig.ready () # Metode dua kali. Naikkan RuntimeError ("Populate () Not Reentrant") # self.app_configs = {} self.loading = true

Mencegah panggilan reentrant untuk menghindari menjalankan appconfig.ready ()

metode dua kali.
nano sshd_config
self.app_configs = {}
# Asalkan server online, ketika kami membuat perubahan lebih lanjut, kami perlu menggunakan perintah berikut untuk memuat ulang server:
# Sudo Systemctl Reload Apache2
# Luar biasa! Tapi bagaimana dengan mengirim surat? Untuk mulai mengirim email, pertama -tama kita harus memperbarui konfigurasi domain. Ini harus ada di panel DNS Anda di Squarespace, atau pendaftar nama domain apa pun yang Anda pilih. Kami juga perlu menginstal dan menambahkan konfigurasi, dan menjalankan beberapa perintah.
# Pertama, mari kita dapatkan alamat IPv6 dari server. Kami akan membuka DNS Anda dan menambahkan catatan.
# Untuk mendapatkan alamat IPv6 server, gunakan perintah ini:
# IP -6 Addr
# Sekarang, kami dapat menambahkan catatan berikut ke pengaturan DNS. Catatan saya terlihat seperti ini. Namun, untuk catatan Anda, Anda harus mengganti alamat IP dengan IP Anda (bukan 75.147.182.214, itu milik saya). Tambahkan juga domain Anda sebagai pengganti femmebabe.com, serta alamat IPv6 Anda yang ditemukan dengan perintah sebelumnya (Anda tidak dapat menggunakan milik saya, Fe80 :: 725a: FFF: FE49: 3E02). Jangan khawatir tentang domainkey untuk saat ini, ini dibuat ketika kami mengatur postfix, server surat, dengan opendkim, dan mencetak kunci. Kami akan mengkonfigurasi ini yang terakhir.
# @
A
N/a
75.147.182.214
# @
MX
10
femmebabe.com
# @
Ptr
N/a
femmebabe.com
# @
Txt
N/a
Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ all
# default._bimi
Txt
N/a
v = bimi1; l = https: //femmebabe.com/media/static/femmeebabe.svg
# _DMARC
Txt
N/a
V = DMARC1; p = tidak ada
# Sekarang, kita perlu menambahkan beberapa konfigurasi yang bertahan untuk postfix. Yang perlu kami lakukan adalah memastikan kami mengganti nama domain, femmebabe.com, dengan nama domain yang Anda gunakan. Mari kita lihat semua file konfigurasi satu per satu, dan instal di direktori yang disebut konfigurasi dalam proyek kami, untuk menginstal ke OS.
# nano config/etc_postfix_main.cf
# Tambahkan teks ini ke file
# # Lihat /usr/share/postfix/main.cf.dist untuk versi yang lebih lengkap dan lebih lengkap


# Debian Spesifik: Menentukan nama file akan menyebabkan yang pertama
# baris file itu untuk digunakan sebagai namanya.  DEBIAN DEFAULT
# is /etc /mailname.
#myorigin = /etc /mailname

smtpd_banner = $ myhostname esmtp $ mail_name (ubuntu)
Biff = tidak

# Menambahkan .Domain adalah pekerjaan MUA.
append_dot_mydomain = tidak

# Uncomment Baris berikutnya untuk menghasilkan peringatan "tertunda surat"
#delay_warning_time = 4h

readme_directory = no

# Lihat http://www.postfix.org/compatibility_readme.html - default ke 3.6 pada
# instalasi segar.
Compatibility_level = 3.6



Parameter # TLS
smtpd_tls_cert_file =/etc/letsencrypt/live/femmebabe.com/fullchain.pem
smtpd_tls_key_file =/etc/letsencrypt/live/femmebabe.com/privkey.pem
smtpd_tls_security_level = may

smtp_tls_capath =/etc/ssl/sertifikat
smtp_tls_session_cache_database = btree: $ {data_directory}/smtp_scache

smtpd_relay_restrictions = empit_sasl_authenticated, defer_unauth_destination
myhostname = femmebabe.com
alias_maps = hash:/etc/alias
alias_database = hash:/etc/alias
myorigin = /etc /mailname
mydestination = femmeebabe.com, localhost, $ myhostname
smtp_helo_name = femmebabe.com
myNetWorks = 127.0.0.0/8 [::ffff:127.0.0 (04/104 [:: 1]/128
mailbox_size_limit = 0
penerima_delimiter = +
inet_interfaces = semua
inet_protocols = semua

Konfigurasi # Milter
milter_default_action = terima
milter_protocol = 6
smtpd_milters = lokal: /opendkim/opendkim.sock
non_smtpd_milters = $ smtpd_milters

smtp_tls_security_level = Encrypt
smtp_tls_loglevel = 1

virtual_transport = lmtp: unix: private/dovecot-lmtp

smtpd_sasl_path = private/auth
# Lihat /usr/share/postfix/main.cf.dist untuk versi yang lebih lengkap dan lebih lengkap
# Debian Spesifik: Menentukan nama file akan menyebabkan yang pertama
# baris file yang akan digunakan sebagai namanya.  DEBIAN DEFAULT
# IS /etc /MailName.
# myorigin = /etc /mailname
# Menambahkan .Domain adalah pekerjaan MUA.
# Unkomment Baris berikutnya untuk menghasilkan peringatan "tertunda surat"
# delay_warning_time = 4h
# Lihat http://www.postfix.org/compatibility_readme.html - default ke 3.6 pada
# instalasi baru.
# Parameter TLS
# Konfigurasi Milter
# Konfigurasi berikutnya!
# nano config/etc_postfix_master.cf
# Tambahkan baris ini:
# #
# Postfix Master Process Configuration File.  Untuk detail tentang format
# dari file, lihat halaman manual master (5) (perintah: "man 5 master" atau
# on-line: http://www.postfix.org/master.5.html).
#
# Jangan lupa untuk mengeksekusi "PostFix Reload" setelah mengedit file ini.
#
# ===============================================================================================
# Layanan Jenis Private UNPRIV CHROOT Wakeup MaxProc Command + Args
# (ya) (ya) (tidak) (tidak pernah) (100)
# ===============================================================================================
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
# Pilih satu: Aktifkan pengiriman hanya untuk klien loopback, atau untuk klien mana pun.
#127.0.0.1: Pengajuan Inet n - Y - - SMTPD
pengiriman inet n - y - - smtpd
  -O smtpd_relay_restrictions = empit_sasl_authenticated, tolak
  -O SMTPD_RECIPIENT_RESTIONS = empit_sasl_authenticated, tolak
  -O syslog_name = postfix/kiriman
  -O smtpd_tls_security_level = enkripsi
  -O smtpd_tls_wrappermode = tidak
  -O smtpd_sasl_auth_enable = ya
  -O smtpd_sasl_type = dovecot
  -O smtpd_sasl_path = private/auth
# -O syslog_name = postfix/kiriman
# -O smtpd_tls_security_level = enkripsi
# -O smtpd_sasl_auth_enable = ya
# -O smtpd_tls_auth_only = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTIONS = $ MUA_HELO_RESTIONS
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTIONS
# -O SMTPD_RECIPIENT_RESTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = empit_sasl_authenticated, tolak
# -o milter_macro_daemon_name = berasal
# Pilih satu: Aktifkan SMTP hanya untuk klien loopback, atau untuk klien mana pun.
#127.0.0.1: smtps inet n - y - - smtpd
#smtps inet n - y - - smtpd
# -O syslog_name = postfix/smtps
# -O smtpd_tls_wrappermode = ya
# -O smtpd_sasl_auth_enable = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTIONS = $ MUA_HELO_RESTIONS
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTIONS
# -O SMTPD_RECIPIENT_RESTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = empit_sasl_authenticated, tolak
# -o milter_macro_daemon_name = berasal
#628 INET N - Y - - QMQPD
pickup unix n - y 60 1 pickup
Cleanup Unix N - Y - 0 Cleanup
qmgr unix n - n 300 1 qmgr
#QMGR UNIX N - N 300 1 OQMGR
TLSMGR UNIX - - Y 1000?   1 tlsmgr
Tulis ulang UNIX - - Y - - TRIVIAL -REWRITE
Bounce Unix - - Y - 0 Bounce
tunda unix - - y - 0 bouncing
Trace Unix - - Y - 0 Bounce
Verifikasi UNIX - - Y - 1 Verifikasi
Flush Unix N - Y 1000?   0 flush
Proxymap Unix - - N - - Proxymap
ProxyWrite Unix - - N - 1 Proxymap
SMTP UNIX - - Y - - SMTP
Relay Unix - - Y - - SMTP
        -O syslog_name = postfix/$ service_name
# -O smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
showq unix n - y - - showq
Kesalahan UNIX - - Y - - Kesalahan
Coba lagi unix - - y - - kesalahan
Buang Unix - - Y - - Buang
UNIX LOKAL - N N - - Lokal
Virtual Unix - N N - - Virtual
LMTP UNIX - - Y - - LMTP
Anvil Unix - - y - 1 Anvil
scache unix - - y - 1 scache
Postlog unix -dgram n - n - 1 postlogd
#
# =======================================================================
# Antarmuka ke perangkat lunak non-pasca-Postfix. Pastikan untuk memeriksa manual
# Halaman dari perangkat lunak non-postfix untuk mengetahui opsi apa yang diinginkannya.
#
# Banyak layanan berikut menggunakan pengiriman pipa postfix (8)
# agen.  Lihat halaman Pipa (8) Man untuk informasi tentang $ {penerima}
# dan opsi amplop pesan lainnya.
# =======================================================================
#
# MailDrop. Lihat file postfix maildrop_readme untuk detailnya.
# Juga tentukan di main.cf: maildrop_destination_recipient_limit = 1
#
Maildrop unix - nn - - pipa
  flags = drxhu user = vmail argv =/usr/bin/maildrop -d $ {penerima}
#
# =======================================================================
#
# Versi Cyrus terbaru dapat menggunakan entri "LMTP" Master.CF yang ada.
#
# Tentukan dalam cyrus.conf:
# lmtp cmd = "lmtpd -a" listen = "localhost: lmtp" proto = tcp4
#
# Tentukan di main.cf satu atau lebih dari yang berikut:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# =======================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Juga tentukan di main.cf: cyrus_destination_recipient_limit = 1
#
#cyrus unix - n n - - pipa
# flags = drx user = cyrus argv =/cyrus/bin/deliver -e -r $ {pengirim} -m $ {ekstensi} $ {user}
#
# =======================================================================
# Contoh pengiriman lama melalui Cyrus.
#
#Old -Cyrus Unix - N N - - Pipa
# flags = r user = cyrus argv =/cyrus/bin/pengiriman -e -m $ {ekstensi} $ {user}
#
# =======================================================================
#
# Lihat file postfix uucp_readme untuk detail konfigurasi.
#
UUCP UNIX - N N - - PIPE
  flags = fqhu user = uucp argv = uux -r -n -z -a $ pengirim -$ nexthop! rmail ($ penerima)
#
# Metode pengiriman eksternal lainnya.
#
ifmail unix - n n - - pipa
  flags = f user = ftn argv =/usr/lib/ifmail/ifmail -r $ nexthop ($ penerima)
BSMTP UNIX - N N - - PIPE
  Bendera = fq. Pengguna = bsmtp argv =/usr/lib/bsmtp/bsmtp -t $ nexthop -f $ pengirim $ penerima
SCALEMAIL -BACKEND UNIX - N N - 2 PIPE
  flags = r user = scalemail argv =/usr/lib/scalemail/bin/scalemail-store $ {nexthop} $ {user} $ {ekstensi}
Mailman UNIX - N N - - PIPE
  flags = frx user = daftar argv =/usr/lib/mailman/bin/postfix-to-mailman.py $ {nexthop}
# 
# File Konfigurasi Proses Master Postfix.  Untuk detail tentang format
# dari file, lihat halaman manual master (5) (perintah: "man 5 master" atau
# On-line: http://www.postfix.org/master.5.html).
# 
# Jangan lupa untuk mengeksekusi "Reload postfix" setelah mengedit file ini.
# 
# ============================================================================
# Jenis Layanan Private Unpriv Chroot Wakeup MaxProc Command + Args
# (ya) (ya) (tidak) (tidak pernah) (100)
# ============================================================================
# smtp inet n - y - 1 postscreen
# SMTPD Pass - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Pilih satu: Aktifkan pengiriman hanya untuk klien loopback, atau untuk klien mana pun.
# 127.0.0.1:submission inet n - y - - smtpd
# -O syslog_name = postfix/kiriman
# -O smtpd_tls_security_level = enkripsi
# -O smtpd_sasl_auth_enable = ya
# -O smtpd_tls_auth_only = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTIons
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O smtpd_relay_restrictions = empit_sasl_authenticated, tolak
# -O milter_macro_daemon_name = berasal
# Pilih satu: Aktifkan SMTP hanya untuk klien loopback, atau untuk klien mana pun.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -O syslog_name = postfix/smtps
# -O smtpd_tls_wrappermode = ya
# -O smtpd_sasl_auth_enable = ya
# -O SMTPD_RECT_UNLISTED_RECIPIENT = no
# -O SMTPD_CLIENT_RESTIons = $ MUA_CLIENT_RESTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTIons
# -O SMTPD_SENDER_RESTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O smtpd_relay_restrictions = empit_sasl_authenticated, tolak
# -O milter_macro_daemon_name = berasal
# 628 INET N - Y - - QMQPD
# qmgr unix n - n 300 1 oqmgr
# -O smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# =======================================================================
# Antarmuka ke perangkat lunak non-postfix. Pastikan untuk memeriksa manual
# Halaman dari perangkat lunak non-postfix untuk mengetahui opsi apa yang diinginkannya.
# 
# Banyak layanan berikut menggunakan pengiriman pipa postfix (8)
# agen.  Lihat halaman Pipa (8) Man untuk informasi tentang $ {penerima}
# dan opsi amplop pesan lainnya.
# =======================================================================

Maildrop. Lihat file postfix maildrop_readme untuk detailnya.

Juga tentukan di main.cf: maildrop_destination_recipient_limit = 1
nano initialize

=======================================================================

# Versi Cyrus terbaru dapat menggunakan entri "LMTP" Master.CF yang ada.

Tentukan dalam cyrus.conf:

lmtp cmd = "lmtpd -a" listen = "localhost: lmtp" proto = tcp4

Tentukan di main.cf satu atau lebih dari yang berikut:
ssh team@XX.XX.XX.XX
mailbox_transport = lmtp: inet: localhost

virtual_transport = lmtp: inet: localhost

=======================================================================

cat ~/.ssh/id_rsa.pub
Cyrus 2.1.5 (Amos Gouaux)

Juga tentukan di main.cf: cyrus_destination_recipient_limit = 1

git clone git://github.com/you/yourproject.git
Cyrus unix - n n - - pipa

flags = drx user = cyrus argv =/cyrus/bin/deliver -e -r $ {pengirim} -m $ {ekstensi} $ {user}

ls
=======================================================================

Contoh pengiriman lama melalui Cyrus.

cp -r yourproject whatyoucalledit
Old -Cyrus Unix - N N - - Pipa

flags = r user = cyrus argv =/cyrus/bin/pengiriman -e -m $ {ekstensi} $ {user}

sudo nano /usr/bin/ascript
=======================================================================

Lihat file postfix uucp_readme untuk detail konfigurasi.
# 
    echo "# 
Metode pengiriman eksternal lainnya.

Dan konfigurasi OpenDKIM. Opendkim mengidentifikasi server email dengan kunci domain untuk membuatnya lebih aman. Tanpa itu, surat tidak ditandatangani dan mungkin tidak sampai ke kotak masuk.
sudo chmod a+x /usr/bin/ascript
Nano config/etc_default_opendkim

Tambahkan baris ini:

# Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim # Layanan SystemD. Harap gunakan parameter konfigurasi yang sesuai di # /etc/opendkim.conf sebagai gantinya. # # Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian jalankan # /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di # /etc/systemd/system/opendkim.service.d/override.conf dan # /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang # Disarankan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf. # #Daemon_opts = "" # Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan # postfix dalam chroot: #Rundir =/var/spool/postfix/run/opendkim Rundir =/run/opendkim # # Uncomment untuk menentukan soket alternatif # Perhatikan bahwa pengaturan ini akan menimpa nilai soket apa pun di opendkim.conf # bawaan: Socket = "lokal: /var/spool/postfix/opendkim/opendkim.sock" # Dengarkan semua antarmuka di port 54321: #Soket = inet: 54321 # Dengarkan Loopback di port 12345: #Soket = inet: 12345@localhost # Dengarkan di 192.0.2.1 di port 12345: #Soket = inet: 12345@192.0.2.1 Pengguna = OpenDkim Grup = Opendkim Pidfile = $ rundir/$ name.pid ExtraFter =
# Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim
# Layanan Systemd. Harap gunakan parameter konfigurasi yang sesuai di
# /etc/opendkim.conf sebagai gantinya.
# 
# Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian mengeksekusi
# /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di
# /etc/systemd/system/opendkim.service.d/override.conf dan
# /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang
# Direkomendasikan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan
# Postfix dalam chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Tidak berkomentar untuk menentukan soket alternatif
# Perhatikan bahwa pengaturan ini akan mengganti nilai soket apa pun di opendkim.conf
# bawaan:
# Dengarkan semua antarmuka di port 54321:
# Soket = inet: 54321
# Dengarkan Loopback di port 12345:
pip3 install --upgrade opencv-python # Soket = inet: 12345@localhost
pip3 install --upgrade opencv-contrib-python # Dengarkan di 192.0.2.1 di port 12345:
# Socket = inet: 12345@192.0.2.1
# nano config/etc_dovecot_conf.d_10-paster.conf
# Tambahkan baris ini:
# 0-master.conf 
#default_process_limit = 100
#default_client_limit = 1000

# Default VSZ (Ukuran Memori Virtual) Batas untuk proses layanan. Ini terutama
# dimaksudkan untuk menangkap dan membunuh proses bocor itu sebelum mereka makan
# semuanya.
#default_vsz_limit = 256m

# Pengguna login digunakan secara internal oleh proses login. Ini yang paling tidak dipercaya
# Pengguna di Sistem Dovecot. Seharusnya tidak memiliki akses ke apa pun.
#default_login_user = Dovenull

# Pengguna internal digunakan oleh proses yang tidak mampu. Itu harus terpisah dari
# Pengguna login, sehingga proses login tidak dapat mengganggu proses lain.
#default_internal_user = dovecot

layanan imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    #port = 993
    #ssl = ya
  }

  # Jumlah koneksi yang harus ditangani sebelum memulai proses baru. Khas
  # Satu -satunya nilai yang berguna adalah 0 (tidak terbatas) atau 1. 1 lebih aman, tetapi 0
  # lebih cepat. 
  #service_count = 1

  # Jumlah proses untuk selalu menunggu lebih banyak koneksi.
  #process_min_avail = 0

  # Jika Anda mengatur service_count = 0, Anda mungkin perlu menumbuhkan ini.
  #vsz_limit = $ default_vsz_limit
}

Layanan Pop3-Login {
  inet_listener pop3 {
    #port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = ya
  }
}

Layanan pengiriman-login {
  kiriman inet_listener {
    #port = 587
  }
}

Layanan LMTP {
  unix_listener/var/spool/postfix/private/dovecot-lmtp {
    grup = postfix
    Mode = 0666
    pengguna = postfix
  }

  # Buat pendengar inet hanya jika Anda tidak dapat menggunakan soket UNIX di atas
  #inet_listener lmtp {
    # Hindari membuat LMTP terlihat untuk seluruh internet
    #address =
    #port = 
  #}
}

layanan imap {
  # Sebagian besar memori masuk ke file mmap (). Anda mungkin perlu meningkatkan ini
  # Batas jika Anda memiliki kotak surat besar.
  #vsz_limit = $ default_vsz_limit

  # Max. Jumlah proses IMAP (koneksi)
  #process_limit = 1024
}

Layanan Pop3 {
  # Max. Jumlah proses POP3 (koneksi)
  #process_limit = 1024
}

Pengajuan Layanan {
  # Max. Jumlah proses pengiriman SMTP (koneksi)
  #process_limit = 1024
}

Layanan Auth {
  # AUTH_SOCKET_PATH menunjuk ke soket userdb ini secara default. Biasanya
  # Digunakan oleh Dovecot-LlA, Doveadm, mungkin proses IMAP, dll. Pengguna yang memiliki
  # Izin lengkap untuk soket ini bisa mendapatkan daftar semua nama pengguna dan
  # Dapatkan hasil pencarian pengguna semua orang.
  #
  # Mode 0666 default memungkinkan siapa saja untuk terhubung ke soket, tetapi
  # Pencarian UserDB hanya akan berhasil jika UserDB mengembalikan bidang "UID" itu
  # cocok dengan uid proses penelepon. Juga jika UID atau GID penelepon cocok dengan
  # Socket's UID atau GID Pencarian berhasil. Hal lain menyebabkan kegagalan.
  #
  # Untuk memberikan izin penuh penelepon untuk mencari semua pengguna, atur mode ke
  # sesuatu yang lain dari 0666 dan dovecot memungkinkan kernel menegakkan
  # Izin (mis. 0777 memungkinkan semua orang izin penuh).
  unix_listener/var/spool/postfix/private/auth {
    Mode = 0660
    pengguna = postfix
    grup = postfix
  }
}

Layanan Auth-Worker {
  # Proses pekerja auth dijalankan sebagai root secara default, sehingga dapat mengakses
  # /etc /shadow. Jika ini tidak perlu, pengguna harus diubah menjadi
  # $ default_internal_user.
  #User = root
}

Dikt Layanan {
  # Jika proxy DICT digunakan, proses surat harus memiliki akses ke soketnya.
  # Misalnya: mode = 0660, grup = vmail dan global mail_access_groups = vmail
  unix_listener dict {
    #mode = 0600
    #User = 
    #group = 
  }
}
# Default_process_limit = 100
# default_client_limit = 1000
# Batas Default VSZ (Ukuran Memori Virtual) untuk proses layanan. Ini terutama
# dimaksudkan untuk menangkap dan membunuh proses bocor itu sebelum mereka makan
# semuanya.
# default_vsz_limit = 256m
# Pengguna login digunakan secara internal oleh proses login. Ini yang paling tidak dipercaya
# Pengguna di Sistem Dovecot. Seharusnya tidak memiliki akses ke apa pun.
# default_login_user = Dovenull
# Pengguna internal digunakan oleh proses yang tidak mampu. Itu harus terpisah dari
# Pengguna Masuk, sehingga proses login tidak dapat mengganggu proses lain.
# default_internal_user = dovecot
# port = 143
# port = 993
# SSL = ya
# Jumlah koneksi yang harus ditangani sebelum memulai proses baru. Khas
# Satu -satunya nilai yang berguna adalah 0 (tidak terbatas) atau 1. 1 lebih aman, tetapi 0
# lebih cepat. <doc/wiki/loginprocess.txt>
# service_count = 1
# Jumlah proses untuk selalu menunggu lebih banyak koneksi.
# Proses_min_avail = 0
# Jika Anda mengatur service_count = 0, Anda mungkin perlu menumbuhkan ini.
# vsz_limit = $ default_vsz_limit
# port = 110
# port = 995
# SSL = ya
# port = 587
# Buat pendengar Inet hanya jika Anda tidak dapat menggunakan soket UNIX di atas
# inet_listener lmtp {
# Hindari membuat LMTP terlihat untuk seluruh internet
# alamat =
port =

}

Sebagian besar memori masuk ke file mmap (). Anda mungkin perlu meningkatkan ini

Batasi jika Anda memiliki kotak surat besar.

vsz_limit = $ default_vsz_limit

Max. Jumlah proses IMAP (koneksi)

Proses_limit = 1024

Max. Jumlah proses POP3 (koneksi)

Proses_limit = 1024

Max. Jumlah proses pengiriman SMTP (koneksi)

Proses_limit = 1024

AUTH_SOCKET_PATH menunjuk ke soket userdb ini secara default. Biasanya

Digunakan oleh Dovecot-LlA, Doveadm, mungkin proses IMAP, dll. Pengguna yang memiliki

Izin lengkap untuk soket ini bisa mendapatkan daftar semua nama pengguna dan

Dapatkan hasil pencarian pengguna semua orang.

Mode 0666 default memungkinkan siapa saja untuk terhubung ke soket, tetapi
# Pencarian UserDB hanya akan berhasil jika UserDB mengembalikan bidang "UID" itu
# cocok dengan uid proses penelepon. Juga jika UID atau GID penelepon cocok dengan
# UID atau GID SOCKET Pencarian berhasil. Hal lain menyebabkan kegagalan.
# 
# Untuk memberikan izin lengkap penelepon untuk mencari semua pengguna, atur mode ke
# sesuatu yang lain dari 0666 dan dovecot memungkinkan kernel menegakkan
# Izin (mis. 0777 memungkinkan semua orang izin penuh).
# Proses pekerja auth dijalankan sebagai root secara default, sehingga dapat mengakses
# /etc/shadow. Jika ini tidak perlu, pengguna harus diubah menjadi
# $ default_internal_user.
# Pengguna = root
# Jika proxy DICT digunakan, proses surat harus memiliki akses ke soketnya.
# Misalnya: mode = 0660, grup = vmail dan global mail_access_groups = vmail
# Mode = 0600
# pengguna =
# grup =
# Sekali lagi, pastikan untuk mengganti domain di semua file ini, femmebabe.com, dengan domain yang Anda pilih. Edit file berikutnya, konfigurasi dovecot,
# nano config/etc_dovecot_dovecot
# Dan tambahkan baris ini
# File konfigurasi ## dovecot

# Jika Anda sedang terburu -buru, lihat http://wiki2.dovecot.org/quickconfiguration

Perintah # "doveconf -n" memberikan output bersih dari pengaturan yang diubah. Gunakan itu
# Alih -alih menyalin & menempel; file saat memposting ke milis Dovecot.

Karakter# '#' dan segalanya setelah diperlakukan sebagai komentar. Ruang ekstra
# dan tab diabaikan. Jika Anda ingin menggunakan salah satu dari ini secara eksplisit, letakkan
# Nilai di dalam kutipan, mis.: key = "# char dan trailing whitespace"

# Pengaturan kebanyakan (tetapi tidak semua) dapat ditimpa oleh protokol yang berbeda dan/atau
# Sumber/tujuan IP dengan menempatkan pengaturan di dalam bagian, misalnya:
# protocol imap {}, lokal 127.0.0.1 {}, jarak 10.0.0.0/8 {}

# Nilai default ditampilkan untuk setiap pengaturan, itu tidak diharuskan untuk tidak mengkomentasikan
# itu. Ini adalah pengecualian untuk ini: tidak ada bagian (mis. Namespace {})
# atau pengaturan plugin ditambahkan secara default, mereka hanya terdaftar sebagai contoh.
# Jalur juga hanya contoh dengan default nyata yang didasarkan pada konfigurasi
# Opsi. Jalur yang tercantum di sini adalah untuk configure --prefix =/usr
# --sysconfdir =/etc ---localstatedir =/var

# Aktifkan protokol yang diinstal
! include_try /usr/share/dovecot/protocols.d/*.protocol

# Daftar IP atau host yang terpisah koma tempat mendengarkan untuk koneksi. 
# "*" Mendengarkan semua antarmuka IPv4, "::" Mendengarkan semua antarmuka IPv6.
# Jika Anda ingin menentukan port non-default atau sesuatu yang lebih kompleks,
# Edit conf.d/master.conf.
#listen = *, ::

# Direktori dasar tempat menyimpan data runtime.
#base_dir =/var/run/dovecot/

# Nama contoh ini. Dalam Multi-Instance Setup Doveadm dan perintah lainnya
# dapat menggunakan -i untuk memilih instance mana yang digunakan (alternatif
# ke -c). Nama contoh juga ditambahkan ke proses dovecot
# dalam output PS.
#instance_name = dovecot

# Pesan ucapan untuk klien.
#login_greeting = dovecot siap.

# Ruang yang terpisah daftar rentang jaringan tepercaya. Koneksi dari ini
# IP diizinkan untuk mengganti alamat dan port IP mereka (untuk penebangan dan
# untuk pemeriksaan otentikasi). disable_plaintext_auth juga diabaikan
# Jaringan ini. Biasanya Anda akan menentukan server proxy IMAP Anda di sini.
#login_trusted_networks =

# Ruang Daftar Soket Pemeriksaan Akses Login (mis. TCPWRAP)
#login_access_sockets = 

# Dengan proxy_maybe = ya jika tujuan proxy cocok dengan IP ini, jangan lakukan
# Proxy. Ini tidak diperlukan secara normal, tetapi mungkin berguna jika tujuan
# IP adalah mis. IP penyeimbang beban.
#Auth_proxy_self =

# Tampilkan lebih banyak judul proses verbose (dalam PS). Saat ini menunjukkan nama pengguna dan
# Alamat IP. Berguna untuk melihat siapa yang sebenarnya menggunakan proses IMAP
# (mis. Kotak surat bersama atau jika UID yang sama digunakan untuk beberapa akun).
#verbose_proctitle = no

# Haruskah semua proses dibunuh ketika proses master dovecot dimatikan.
# Mengatur ini ke "tidak" berarti dovecot dapat ditingkatkan tanpa
# Memaksa koneksi klien yang ada untuk ditutup (meskipun itu juga bisa
# Masalah jika peningkatannya mis. karena perbaikan keamanan).
#shutdown_clients = ya

# Jika bukan nol, jalankan perintah surat melalui banyak koneksi ke server DOVEADM,
# Alih -alih menjalankannya langsung dalam proses yang sama.
#doveadm_worker_count = 0
# Unix socket atau host: port yang digunakan untuk menghubungkan ke server doveadm
#doveadm_socket_path = doveadm-server

# Daftar variabel lingkungan yang terpisah ruang yang disimpan di Dovecot
# startup dan diturunkan ke semua proses anaknya. Anda juga bisa memberi
# key = pasangan nilai untuk selalu mengatur pengaturan tertentu.
#import_environment = TZ

##
Pengaturan Server Kamus ##
##

# Kamus dapat digunakan untuk menyimpan kunci = daftar nilai. Ini digunakan oleh beberapa orang
# plugin. Kamus dapat diakses secara langsung atau meskipun a
# Server Kamus. Dict Block Dict Names Dictionary Names to URIS berikut
# Saat server digunakan. Ini kemudian dapat dirujuk menggunakan URI dalam format
# "Proxy ::".

Dict {
  #quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
}

# Sebagian besar konfigurasi yang sebenarnya disertakan di bawah ini. Nama file
# Pertama kali diurutkan berdasarkan nilai ASCII mereka dan diuraikan dalam urutan itu. 00-prefix
# Dalam nama file dimaksudkan untuk memudahkan pemesanan.
! Sertakan conf.d/*. conf

# File konfigurasi juga dapat mencoba dimasukkan tanpa memberikan kesalahan jika
# Tidak ditemukan:
! Sertakan_try local.conf

passdb {
  driver = file passwd
  args =/etc/dovecot/passwd
}
userdb {
  driver = passwd
}

protokol = imap pop3

#Allows dovecot untuk mendengarkan semua koneksi input (ipv4 / ipv6)

Dengarkan = *, ::
File Konfigurasi Dovecot

Jika Anda sedang terburu -buru, lihat http://wiki2.dovecot.org/quickconfiguration

Perintah "Doveconf -n" memberikan output bersih dari pengaturan yang diubah. Gunakan itu
ping femmebabe.com # Alih -alih menyalin & menempelkan file saat memposting ke milis Dovecot.
'Karakter dan segalanya setelah diperlakukan sebagai komentar. Ruang ekstra

dan tab diabaikan. Jika Anda ingin menggunakan salah satu dari ini secara eksplisit, letakkan

char dan trailing whitespace "

Sebagian besar pengaturan (tetapi tidak semua) dapat ditimpa dengan berbagai protokol dan/atau

Sumber/tujuan IP dengan menempatkan pengaturan di dalam bagian, misalnya:

protocol imap {}, lokal 127.0.0.1 {}, jarak 10.0.0.0/8 {}

Nilai default ditampilkan untuk setiap pengaturan, itu tidak diperlukan untuk tidak mengkomentasikan
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
itu. Ini adalah pengecualian untuk ini: tidak ada bagian (mis. Namespace {})

atau pengaturan plugin ditambahkan secara default, mereka hanya terdaftar sebagai contoh.

Jalur juga hanya contoh dengan default nyata yang didasarkan pada konfigurasi
nano yourproject/settings.py
opsi. Jalur yang tercantum di sini adalah untuk configure --prefix =/usr

--sysconfdir =/etc ---localstatedir =/var

Aktifkan protokol yang diinstal
# Daftar IP atau host yang dipisahkan koma tempat mendengarkan untuk koneksi.
"*" mendengarkan semua antarmuka IPv4, "::" Mendengarkan semua antarmuka IPv6.

Jika Anda ingin menentukan port non-default atau sesuatu yang lebih kompleks,

Edit conf.d/master.conf.
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Dengarkan = *, ::

Direktori dasar tempat menyimpan data runtime.

base_dir =/var/run/dovecot/
ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80> 
	Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Alias /static /home/team/femmebabe/static
	<Directory /home/team/femmebabe/static>
		Require all granted
	</Directory>

Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>

	<Directory /home/team/femmebabe/femmebabe>
		<Files wsgi.py>
			Require all granted
		</Files>
	</Directory>

	WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
	WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
	WSGIProcessGroup femmebabe
	WSGIApplicationGroup %{GLOBAL}
	
	<Directory /home/team/femmebabe/static>
                Options Indexes FollowSymLinks
                AllowOverride All
	</Directory>

	<IfModule mod_rewrite.c>
		RewriteEngine on
		RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
		RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
		RewriteRule ^(.+?)/$ /media/$1 [F,L]
	</IfModule>

	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem

	Header set X-Frame-Options: "SAMEORIGIN"
	Header set Access-Control-Allow-Origin "https://femmebabe.com"

	TimeOut 60000
	LimitRequestBody 0

	<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
		Header set Cache-Control "max-age=30, public"
	</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	RewriteEngine on
	RewriteCond %{SERVER_NAME} =femmebabe.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Nama contoh ini. Dalam Multi-Instance Setup Doveadm dan perintah lainnya

dapat menggunakan -i <stalle_name> untuk memilih instance mana yang digunakan (alternatif

ke -c <igig_path>). Nama contoh juga ditambahkan ke proses dovecot
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
dalam output PS.

instance_name = dovecot

Pesan ucapan untuk klien.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
LOGIN_GREETING = DOVECOT SIAP.

Daftar Rentang Jaringan Tepercaya yang Dipisahkan Ruang. Koneksi dari ini

IP diizinkan untuk mengesampingkan alamat dan port IP mereka (untuk penebangan dan
cd projectname
source venv/bin/activate
python manage.py check
untuk pemeriksaan otentikasi). disable_plaintext_auth juga diabaikan

jaringan ini. Biasanya Anda akan menentukan server proxy IMAP Anda di sini.

login_trusted_networks =
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Daftar Soket Pemeriksaan Akses Login yang Dipisahkan (mis. TCPWRAP)

login_access_sockets =

Dengan proxy_maybe = ya jika tujuan proxy cocok dengan IP ini, jangan lakukan
                # proksi. Ini tidak diperlukan secara normal, tetapi mungkin berguna jika tujuan
                # IP adalah mis. IP penyeimbang beban.
# auth_proxy_self =
Tampilkan lebih banyak judul proses verbose (dalam PS). Saat ini menunjukkan nama pengguna dan

Alamat IP. Berguna untuk melihat siapa yang sebenarnya menggunakan proses IMAP

(Misalnya kotak surat bersama atau jika UID yang sama digunakan untuk beberapa akun).
python manage.py check
verbose_proctitle = no

Jika semua proses dibunuh ketika proses master dovecot dimatikan.

Mengatur ini ke "tidak" berarti dovecot dapat ditingkatkan tanpa
                # memaksa koneksi klien yang ada untuk ditutup (meskipun itu juga bisa
                # Masalah jika peningkatannya adalah mis. karena perbaikan keamanan).
# shutdown_clients = ya
Jika bukan nol, jalankan perintah surat melalui banyak koneksi ke server DOVEADM,

Alih -alih menjalankannya secara langsung dalam proses yang sama.

doveadm_worker_count = 0
sudo systemctl reload apache2
Unix Socket atau Host: Port Digunakan untuk Menghubungkan ke Doveadm Server

doveadm_socket_path = doveadm-server

Daftar Variabel Lingkungan yang Dipisahkan Ruang yang disimpan di Dovecot

startup dan diturunkan ke semua proses anaknya. Anda juga bisa memberi

kunci = pasangan nilai untuk selalu mengatur pengaturan tertentu.

import_environment = tz

ip -6 addr
Pengaturan Server Kamus

Kamus dapat digunakan untuk menyimpan kunci = daftar nilai. Ini digunakan oleh beberapa orang

plugin. Kamus dapat diakses secara langsung atau meskipun a

Server Kamus. Dict Block Dict Names Dictionary Names to URIS berikut

Saat server digunakan. Ini kemudian dapat dirujuk menggunakan URI dalam format

"Proxy :: <name>".

kuota = mysql: /etc/dovecot/dovecot-ronic-sql.conf.ext

Sebagian besar konfigurasi yang sebenarnya disertakan di bawah ini. Nama file

pertama kali diurutkan berdasarkan nilai ASCII mereka dan diuraikan dalam urutan itu. 00-prefix

Dalam nama file dimaksudkan untuk membuatnya lebih mudah untuk memahami pemesanan.

File konfigurasi juga dapat mencoba dimasukkan tanpa memberikan kesalahan jika

itu tidak ditemukan:

Mengizinkan Dovecot mendengarkan semua koneksi input (IPv4 / IPv6)

Tambahkan kata sandi untuk pengguna dovecot:

Nano config/etc_dovecot_passwd

Bagian pertama dari file, sebelum usus besar, adalah nama pengguna. Bagian terakhir, "YourPassword", menunjukkan kata sandi yang ingin Anda berikan kepada server surat Anda.

Tim: {Plain} Yourpassword

Selanjutnya, konfigurasi opendkim
nano config/etc_postfix_main.cf
nano config/etc_opendkim.conf

Dan tambahkan baris ini:

# Ini adalah konfigurasi dasar untuk menandatangani dan memverifikasi. Itu bisa dengan mudah # Diadaptasi agar sesuai dengan instalasi dasar. Lihat opendkim.conf (5) dan # /usr/share/doc/opendkim/examples/opendkim.conf.sample untuk lengkap # Dokumentasi parameter konfigurasi yang tersedia. Syslog Ya Syslogsuccess Ya #Logshy no # Parameter penandatanganan dan verifikasi umum. Di Debian, header "dari" adalah # Diawasi, karena sering kali merupakan kunci identitas yang digunakan oleh sistem reputasi # dan dengan demikian agak sensitif keamanan. Canonicalization Santai/Sederhana Mode s Subdomain no Oversignheader dari # Menandatangani domain, pemilih, dan kunci (diperlukan). Misalnya, lakukan penandatanganan # untuk domain "example.com" dengan pemilih "2020" (2020._domainkey.example.com), # Menggunakan kunci pribadi yang disimpan di /etc/dkimkeys/example.private. Lebih granular # Opsi Pengaturan dapat ditemukan di /usr/share/doc/opendkim/readme.opendkim. #Domain example.com #Selector 2020 #Keyfile /etc/dkimkeys/example.private # Di Debian, Opendkim berjalan sebagai pengguna "Opendkim". Umask 007 diperlukan saat # Menggunakan soket lokal dengan MTA yang mengakses soket sebagai non-priviled # Pengguna (misalnya, postfix). Anda mungkin perlu menambahkan pengguna "postfix" ke grup # "Opendkim" dalam hal ini. Userid Opendkim Umask 007 # Soket untuk koneksi MTA (diperlukan). Jika MTA berada di dalam penjara chroot, # Harus dipastikan bahwa soket dapat diakses. Di Debian, postfix berjalan # chroot in/var/spool/postfix, oleh karena itu soket unix harus # Dikonfigurasi seperti yang ditunjukkan pada baris terakhir di bawah ini. #Socket lokal: /run/opendkim/opendkim.sock #Socket inet: 8891@localhost #Socket inet: 8891 Socket lokal: /var/spool/postfix/opendkim/opendkim.sock Pidfile /run/opendkim/opendkim.pid # Host untuk menandatangani daripada memverifikasi, default adalah 127.0.0.1. Lihat # Bagian Operasi Opendkim (8) untuk informasi lebih lanjut. #Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 # Jangkar Trust memungkinkan DNSSEC. Di Debian, file jangkar trust disediakan # oleh paket DNS-Root-Data. Trustanchorfile /usr/share/dns/root.key #Nameserver 127.0.0.1 # Peta domain di dari alamat ke kunci yang digunakan untuk menandatangani pesan KeyTable Refile: /etc/opendkim/key.table Refile yang dapat ditandatangani: /etc/opendkim/signing.table # Satu set host internal yang suratnya harus ditandatangani Internalhosts /etc/opendkim/trusted.hosts
# Ini adalah konfigurasi dasar untuk menandatangani dan memverifikasi. Itu bisa dengan mudah
# Diadaptasi agar sesuai dengan instalasi dasar. Lihat opendkim.conf (5) dan
# /usr/share/doc/opendkim/examples/opendkim.conf.sample untuk lengkap
# Dokumentasi parameter konfigurasi yang tersedia.
# Logenghy tidak
# Parameter Penandatanganan dan Verifikasi Umum. Di Debian, header "dari" adalah
# Division, karena sering kali merupakan kunci identitas yang digunakan oleh sistem reputasi
# dan dengan demikian agak sensitif keamanan.
# Menandatangani domain, pemilih, dan kunci (diperlukan). Misalnya, lakukan penandatanganan
# untuk domain "example.com" dengan pemilih "2020" (2020._domainkey.example.com),
# Menggunakan kunci pribadi yang disimpan di /etc/dkimkeys/example.private. Lebih granular
# Opsi Pengaturan dapat ditemukan di /usr/share/doc/opendkim/readme.opendkim.
Domain example.com

Selector 2020

Keyfile /etc/dkimkeys/example.private
nano config/etc_postfix_master.cf
Di Debian, Opendkim berjalan sebagai pengguna "Opendkim". Umask 007 diperlukan saat

Menggunakan soket lokal dengan MTA yang mengakses soket sebagai non-priviled

Pengguna (misalnya, postfix). Anda mungkin perlu menambahkan pengguna "postfix" ke grup
# "Opendkim" dalam hal ini.
# Soket untuk koneksi MTA (diperlukan). Jika MTA berada di dalam penjara chroot,
# Harus dipastikan bahwa soket dapat diakses. Di Debian, postfix berjalan
# chroot in/var/spool/postfix, oleh karena itu soket unix harus
# dikonfigurasi seperti yang ditunjukkan pada baris terakhir di bawah ini.
# Socket lokal: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
# Host untuk menandatangani daripada memverifikasi, default adalah 127.0.0.1. Lihat
# Bagian Operasi Opendkim (8) untuk informasi lebih lanjut.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Jangkar Trust memungkinkan DNSSEC. Di Debian, file jangkar trust disediakan
# oleh paket DNS-Root-Data.
# Nameserver 127.0.0.1
# Peta domain di dari alamat ke kunci yang digunakan untuk menandatangani pesan
# Satu set host internal yang suratnya harus ditandatangani
# Nano config/etc_default_opendkim
# Dan tambahkan baris ini
# # Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim
# Layanan SystemD. Harap gunakan parameter konfigurasi yang sesuai di
# /etc/opendkim.conf sebagai gantinya.
#
# Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian jalankan
# /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di
# /etc/systemd/system/opendkim.service.d/override.conf dan
# /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang
# Disarankan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf.
#
#Daemon_opts = ""
# Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan
# postfix dalam chroot:
#Rundir =/var/spool/postfix/run/opendkim
Rundir =/run/opendkim
#
# Uncomment untuk menentukan soket alternatif
# Perhatikan bahwa pengaturan ini akan menimpa nilai soket apa pun di opendkim.conf
# bawaan:
Socket = "lokal: /var/spool/postfix/opendkim/opendkim.sock"
# Dengarkan semua antarmuka di port 54321:
#Soket = inet: 54321
# Dengarkan Loopback di port 12345:
#Soket = inet: 12345@localhost
# Dengarkan di 192.0.2.1 di port 12345:
#Soket = inet: 12345@192.0.2.1
Pengguna = OpenDkim
Grup = Opendkim
Pidfile = $ rundir/$ name.pid
ExtraFter =
# Catatan: Ini adalah file konfigurasi warisan. Itu tidak digunakan oleh opendkim
# Layanan Systemd. Harap gunakan parameter konfigurasi yang sesuai di
# /etc/opendkim.conf sebagai gantinya.
# 
# Sebelumnya, orang akan mengedit pengaturan default di sini, dan kemudian mengeksekusi
# /lib/opendkim/opendkim.service.generate untuk menghasilkan file override systemd di
# /etc/systemd/system/opendkim.service.d/override.conf dan
# /etc/tmpfiles.d/opendkim.conf. Meskipun ini masih mungkin, sekarang
# Direkomendasikan untuk menyesuaikan pengaturan langsung di /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Ubah ke/var/spool/postfix/run/opendkim untuk menggunakan soket unix dengan
# Postfix dalam chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Tidak berkomentar untuk menentukan soket alternatif
# Perhatikan bahwa pengaturan ini akan mengganti nilai soket apa pun di opendkim.conf
# bawaan:
# Dengarkan semua antarmuka di port 54321:
# Soket = inet: 54321
# Dengarkan Loopback di port 12345:
# Soket = inet: 12345@localhost
# Dengarkan di 192.0.2.1 di port 12345:
# Socket = inet: 12345@192.0.2.1
# Ketika kami siap mengatur server postfix kami, kami akan menjalankan kode di bawah ini, dengan nama domain yang sesuai tertanam. Mulailah dengan membuat skrip
# Touch Scripts/PostFixSetup
sudo chmod a+x skrip/postfixsetup
Nano Scripts/Postfixsetup
# Sekarang, di Nano, editor teks, edit file ini sehingga termasuk nama domain Anda alih -alih femmebabe.com.
# #!/Bin/Bash
# Setup Postfix
CD $ dir
Echo "Konfigurasi Layanan Surat"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim/etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-suth.conf /etc/dovecot/conf.d/10-suth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim/etc/default/opendkim
sudo adduser postfix opendkim
sudo mkdir /etc /opendkim
sudo mkdir/etc/opendkim/kunci
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir/var/spool/postfix/opendkim
sudo echo "*@femmebabe.com sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "*.femMebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts
sudo chown -r OpenDkim: Opendkim /etc /opendkim
sudo opendkim-genkey -b 2048 -d femmebabe.com -d /etc/opendkim/keys/femmebabe.com -s sendonly -v
sudo chmod go-rw/etc/opendkim/kunci
Sudo Chown Opendkim: opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
Sudo Chown Opendkim: postfix/var/spool/postfix/opendkim
CD $ dir
Sudo CP Mailbox/*/var/mail/
sudo chown: pengguna/var/mail/*
sudo chmod -r a+rwx/var/mail/*
Sudo Systemctl Restart Opendkim Postfix Dovecot
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\ n' | sed 's/\ s // g' | sed 's "" // g' | awk -f '[) (]' '{print $ 2}'
# !/bin/bash
# Pengaturan postfix
# Sekarang, jalankan skrip yang sudah selesai untuk mengonfigurasi postfix, opendkim dan dovecot.
# ./scripts/postfixsetup
# Setelah skrip ini berjalan, salin baris terakhir yang dicetak dan tempel ke konfigurasi DNS Anda sebagai nilai untuk sendonly._domainkey. Ini adalah kunci Opendkim yang digunakan untuk mengidentifikasi domain Anda saat mengirim surat yang aman.
# Luar biasa! Dalam beberapa hari, Anda harus dapat mengirim surat dari server asalkan semuanya dikonfigurasi dengan benar.
# Jika Anda baru saja mengonfigurasi DNS untuk server email Anda, perlu waktu kurang dari 72 jam untuk diperbarui catatan. Biasanya jauh lebih cepat. Anda dapat memeriksa apakah server Anda berfungsi dengan menggunakan perintah ini, disediakan email Anda:
# echo "tes" | Mail -s "Uji Email" youremail@gmail.com
# Jika semuanya tampak berfungsi dengan benar, Anda harus dapat mengirim email dengan server Anda. Jika tidak berfungsi, cobalah melihat log untuk melihat apa kesalahannya.
# ekor –lines 150 /var/log/mail.log
# Ini akan menawarkan informasi verbose tentang surat yang dikirim oleh server dan apakah itu berfungsi dengan baik. Anda harus dapat melihat email di kotak masuk Anda juga, jika tidak ada, periksa folder spam Anda.
# Anda juga perlu mengonfigurasi pengaturan Anda di pengaturan Anda.py sehingga server email Anda dapat berbicara dengan aplikasi Django Anda, proyek. Tambahkan atau ganti baris ini di pengaturan Anda
# Email_host = domain
Email_port = 587
Email_use_tls = true
Email_address = 'team@femmeebabe.com'
Email_host_user = 'tim' #'love@mamasheen.com '
Email_host_password = config ['email_host_password']
Default_from_email = '{} <{}>'. Format (situs_name, email_host_user)
# 'Love@mamasheen.com'
# Perhatikan bahwa kami menggunakan file konfigurasi untuk mendapatkan kata sandi. Mari kita muat file ini di pengaturan seperti itu, di awal file.:
# Impor OS
Impor JSON

# Buka dan muat konfigurasi
dengan terbuka ('/etc/config.json') sebagai config_file:
    config = json.load (config_file)
# Buka dan Muat Konfigurasi
# Mari kita buat file ini dan tambahkan tombol rahasia untuk itu, serta kata sandi email. Untuk menghasilkan kunci rahasia, gunakan perintah ini, dengan panjang apa pun yang Anda suka di akhir:
# OpenSSL Rand -Base64 64
# Sekarang, salin teks yang OpenSSL dihasilkan dan edit /etc/config.json
# sudo nano /etc/config.json
# Tambahkan baris berikut ke file Anda, dengan kunci yang OpenSSL dihasilkan sebagai kunci rahasia.
# {
	"Secret_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-generated-using-openssl)",
	"Email_host_password": "word yourpass"
}
# Format JSON sederhana dan mudah digunakan, kami dapat menyatakan kunci lain yang ingin kami gunakan dalam proyek kami dengan cara ini juga, dan membuat mereka terpisah dari direktori proyek kami sehingga pengguna lain tidak dapat menulis kepada mereka dan sehingga mereka tidak dapat dibaca dari direktori proyek kami saja. Ini adalah praktik yang disarankan untuk kunci API, yang akan kami gunakan lebih dari beberapa di sini.
# Anda juga ingin mencadangkan proyek Anda untuk memastikan semuanya disimpan dan Anda dapat memulihkan pekerjaan Anda nanti bahkan jika Anda tidak lagi ingin menyewa server.
# cadangan sudo
# Sekarang, coba kirim email HTML dari server web, asalkan mengirim satu dari baris perintah berfungsi. Permintaan contoh pengguna Anda di shell, dan kirim email HTML ke pengguna itu melalui Django. Ubah nama saya di kode, Charlotte, menjadi nama pengguna Anda.
# python kelola.py shell
dari django.contrib.auth.models impor pengguna
u = user.objects.get (username = 'charlotte')
dari users.email impor send_welcome_email
send_welcome_email (u)
KELUAR()
# Jika perintah pertama tidak berfungsi, pastikan untuk digunakan
# Sumber venv/bin/aktifkan
# Asalkan semuanya diatur dengan benar, sekarang Anda akan mendapatkan email selamat datang di kotak surat Anda yang dikirim oleh aplikasi web Anda. Kerja bagus! Anda sudah jauh.
# Saya ingin menambahkan, jika Anda pernah berjuang dengan kesalahan sama sekali saat mengerjakan proyek seperti ini, jangan ragu untuk mencari jawaban dan meminta bantuan. Google, di antara mesin pencari lainnya, adalah sumber yang bagus untuk mencari bantuan pemrograman. Cukup cari kesalahan yang Anda dapatkan, dan Anda akan dapat melihat bagaimana orang lain menyelesaikan masalah. Juga, Anda dipersilakan untuk menghubungi saya, pendidik Anda (guru, profesor, tutor), setiap rekan di internet yang tersedia untuk bantuan pemrograman, atau berkonsultasi dengan buku ini lagi atau sumber daya lain untuk menemukan solusi untuk masalah yang Anda alami. Saya mengerti ini tidak mudah, tetapi bahkan jika Anda telah membaca sejauh ini dan tidak menulis kode apa pun, Anda belajar banyak tentang membangun aplikasi web dari awal. Tepuk punggung diri Anda, Anda melakukan pekerjaan dengan baik.
# Terima kasih telah meluangkan waktu untuk membaca panduan pengembangan web edisi ketiga ini. Dalam edisi mendatang, saya akan memasukkan lebih banyak contoh penting yang dibahas di awal dokumen dan kami akan menyelam lebih dalam ke dunia pengembangan perangkat lunak dan perangkat keras. Tetap disini untuk apa yang akan datang, dan saya berharap dapat mengajari Anda cara membangun perangkat lunak yang luar biasa. Sampai jumpa di edisi berikutnya!
# Kunjungi tautan ini (ini akan membawa Anda keluar dari Lotte Harper)








nano config/etc_default_opendkim
























nano config/etc_dovecot_conf.d_10-master.conf
































































nano config/etc_dovecot_dovecot











































































nano config/etc_dovecot_passwd

team:{plain}yourpassword

nano config/etc_opendkim.conf


































nano config/etc_default_opendkim
























touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup


./scripts/postfixsetup

echo "test" | mail -s "Test Email" youremail@gmail.com

tail –lines 150 /var/log/mail.log

openssl rand -base64 64

sudo nano /etc/config.json

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}

sudo backup

python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()

source venv/bin/activate






Críoch a chur le
Freastalaí 1
Léim
Féach an t -alt iomlán
Lean ar aghaidh ag léamh

Ceannaigh le Crypto



https://glamgirlx.com/ga/practical-web-based-deep-learning-and -


Siamsaíocht ghairmiúil, grianghraif, físeáin, fuaime, sruthú beo agus gameplay ócáideach, chomh maith le scanadh ID, forbairt gréasáin agus seirbhísí máthairionadaíochta.

Fág barr dom i Bitcoin ag baint úsáide as an seoladh seo: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Téarmaí Seirbhíse